目录
一、背景
取组内按照某时间最新一条数据对应的值
二、预期结果
1、示例数据表pay_flow:
store_code | sell_time | amount |
---|---|---|
0001 | 2024-01-16 23:58:29 | 4 |
0001 | 2024-01-16 23:55:22 | 3 |
0001 | 2024-01-16 23:50:25 | 8 |
0002 | 2024-01-16 23:46:19 | 10 |
0002 | 2024-01-16 23:41:27 | 5 |
2、按照store_code对sell_time进行排序:
store_code | sell_time | amount | rank |
---|---|---|---|
0001 | 2024-01-16 23:58:29 | 4 | 1 |
0001 | 2024-01-16 23:55:22 | 3 | 2 |
0001 | 2024-01-16 23:50:25 | 8 | 3 |
0002 | 2024-01-16 23:46:19 | 10 | 1 |
0002 | 2024-01-16 23:41:27 | 5 | 2 |
3、取每组的第一条数据,实现组内按照某时间最新一条数据对应的值
store_code | sell_time | amount | rank |
---|---|---|---|
0001 | 2024-01-16 23:58:29 | 4 | 1 |
0002 | 2024-01-16 23:46:19 | 10 | 1 |
三、实现sql
1、首先按照需求排序
-- 首先按照需求排序获取序号
select store_code,sell_time,amount,
ROW_NUMBER() over(PARTITION BY store_code order by sell_time desc) as `rank` FROM pay_flow ;
2、 取每组的第一条数据,实现预期效果
-- 完整sql,取出行号为1的数据
select * from
(
select store_code,sell_time,amount,
ROW_NUMBER() over(PARTITION BY store_code order by sell_time desc) as `rank`
FROM pay_flow
)a where a.`rank` = 1
四、sql分析
ROW_NUMBER() over(PARTITION BY store_code order by sell_time desc)
1、ROW_NUMBER() OVER ( ):为窗口函数,查询结果加序号
2、PARTITION BY 分区,能显示组里所有个体的记录,通过order by 在区内排序,窗口函数排序号
3、order by sell_time desc 即指定组内按什么排序