如何在不同分组中获取每个rank对应的最后一行数据
提取每个rank对应的最后一行数据
原始数据表
| id | type | start date | rank |
|---|---|---|---|
| 111 | 15 | 1/1/22 | 1 |
| 111 | 15 | 1/3/22 | 1 |
| 111 | 15 | 2/04/22 | 1 |
| 111 | 23 | 1/02/22 | 2 |
| 111 | 23 | 1/3/22 | 2 |
| 111 | 25 | 16/03/22 | 3 |
需求说明
现有数据表中,同一id对应不同type,每个type对应相同的rank,rank按start date排序。需要提取每个rank中start date最晚的记录,即每个rank对应的最后一行数据。
预期结果
| id | type | start date | rank |
|---|---|---|---|
| 111 | 15 | 2/04/22 | 1 |
| 111 | 23 | 1/3/22 | 2 |
| 111 | 25 | 16/03/22 | 3 |
解决方案
方案1:使用窗口函数(适用于MySQL 8+、PostgreSQL、SQL Server等)
利用ROW_NUMBER()窗口函数按rank分组,每组内按日期倒序排序后取第一条记录:
SELECT id, type, `start date`, rank FROM ( SELECT id, type, `start date`, rank, ROW_NUMBER() OVER (PARTITION BY rank ORDER BY `start date` DESC) AS rn FROM your_table ) t WHERE rn = 1;
方案2:分组关联(兼容低版本SQL)
先按rank分组获取每个组的最大日期,再关联原表匹配对应记录:
SELECT t1.id, t1.type, t1.`start date`, t1.rank FROM your_table t1 INNER JOIN ( SELECT rank, MAX(`start date`) AS max_date FROM your_table GROUP BY rank ) t2 ON t1.rank = t2.rank AND t1.`start date` = t2.max_date;
内容的提问来源于stack exchange,提问作者Bar Fichman
相关产品推荐
相关产品推荐

