ROW_NUMBER函数的使用
# 需求描述
查询统计经常有这样的需求:需要根据某个字段进行分组,然后获取每个分组的一条数据,举例子:有一张订单表(t_order),包含 order_id,user_id,price,title,create_time ... ,需要查询每个用户的第一个订单。如何写这条SQL?ROW_NUMBER在这种场景下就非常有用了。
# 实现方案
直接看SQL:
SELECT
user_id,
order_id,
price ,
title,
create_time
FROM
(
SELECT
user_id,
order_id,
price ,
title,
create_time
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY create_time) AS rn
FROM
recharge_table
) t
WHERE
rn = 1
ORDER BY
create_time;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PARTITION BY user_id ORDER BY create_time
字段解析:
- PARTITION BY user_id: 根据 user_id 进行分组
- 在分组内根据create_time 进行排序
ROW_NUMBER() OVER (..) as rn
则是对组内的排序进行编号
要查询分组内的第一条数据,我们只需要在外面在包装一层sql,限制只查询 rn =1
即可
# 总结
- 先根据一个字段进行分组
- 在分组内做排序并编号
- 查询编号等于1的数据
上次更新: 2024/04/08, 20:31:17