row_number() over partition by 分组聚合

本文详细介绍了如何使用SQL的ROW_NUMBER()函数对学生成绩进行排序,包括按课程分组并设置70分分界线。通过实例展示了如何结合partition by和case when语句实现特定条件下的成绩排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自https://blog.youkuaiyun.com/yilulvxing/article/details/85098273

row_number 语法
ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号。在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是一致的,当使用ROW_NUMBER函数时,也需要专门一列用于预先排序以便于进行编号

partition by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,分区函数一般与排名函数一起使用。

原始表score:

s_id 表是学生编号,c_id表是课程编号,s_score 表是学生对应的课程分数
在这里插入图片描述

1.要求:得出每门课程的学生成绩排序(升序)

----因为是每门课程的结果,并且要排序,所以用row_number

select * ,row_number() over (partition by c_id order by s_score) from score;
返回结果:

在这里插入图片描述

2:进一步要求:得出每门课程的学生成绩,并且按照70分作为分割线排序—即低于70分的排序,高于70分的排序

select * ,row_number() over (partition by c_id,(case when s_score>70 then 1 else 0 end) order by s_score) from score;

返回结果:

在这里插入图片描述

 

`ROW_NUMBER()` OVER() 和 `COLLECT` 是 SQL 中用于数据分组操作的不同函数,它们在处理查询结果的排序和汇总方面各有用途。 ### ROW_NUMBER() `ROW_NUMBER()` 是一个窗口函数,在对结果集进行排序的基础上给每行分配一个唯一数字序号。这通常在需要对分组后的数据进行顺序编号的情况下使用。它不依赖于任何聚合计算,只是简单地按照指定的排序规则为每一行分配序列号。 ```sql SELECT table_name, column_value, ROW_NUMBER() OVER (ORDER BY column_value DESC) as RowOrder FROM your_table; ``` 在这段示例中,`ROW_NUMBER()` 函数结合了 `ORDER BY` 子句按降序排序,为表 `your_table` 的列 `column_value` 分配了唯一的行号 `RowOrder`。 ### COLLECT 相比之下,`COLLECT` 是 Oracle、SQL Server 等数据库系统提供的函数,用于收集一组值,并将它们作为数组返回。这个函数可以配合窗口函数一起使用,常用于统计特定分组内的集合信息,如计数、平均值等。 #### 示例: 假设有一个名为 `orders` 的表,其中包含订单信息,包括客户 ID (`customer_id`)、产品名称 (`product_name`) 和订单日期 (`order_date`)。我们想要获取每个客户的订单列表,并按订单日期排序,同时得到每个客户的订单总数: ```sql WITH ordered_orders AS ( SELECT customer_id, product_name, order_date, RANK() OVER (PARTITION BY customer_id ORDER BY order_date) as rank, COUNT(*) OVER (PARTITION BY customer_id) as order_count FROM orders ) SELECT customer_id, GROUP_CONCAT(product_name SEPARATOR ', ') as products_list, order_count, MAX(order_date) as latest_order_date FROM ordered_orders WHERE rank = 1 -- 只关注最近的一笔订单 GROUP BY customer_id, order_count; ``` 在这个例子中: - `RANK()` 和 `COUNT(*)` 都使用了窗口函数 `OVER()` 进行分组。 - 使用 `GROUP_CONCAT` 功能将 `ordered_orders` 表内同一客户的所有产品名称连接成一个字符串列表。 ### 相关问题: 1. `ROW_NUMBER()` 和 `RANK()` 之间的区别是什么? 2. `ROW_NUMBER()` 如何在复杂查询中优化性能? 3. `COLLECT` 联合窗口函数的应用场景有哪些?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值