SQL查询:按姓名提取各季度最新数据(取最大ID记录)
问题描述
我数据库中有如下表格:
| ID | Name | Quarter | Value |
|---|---|---|---|
| 1 | Martin | 1 | 100 |
| 2 | Smith | 1 | 110 |
| 3 | Doe | 1 | 115 |
| 4 | Martin | 2 | 110 |
| 5 | Smith | 2 | 110 |
| 6 | Doe | 2 | 115 |
| 7 | Martin | 2 | 115 |
| 8 | Smith | 2 | 110 |
| 9 | Doe | 2 | 115 |
| 10 | Martin | 3 | 120 |
| 11 | Smith | 3 | 115 |
| 12 | Doe | 3 | 115 |
需要按Name提取每个Quarter对应的Value值。由于表格来自SQL插入的dump结果,可能存在同一Name同一Quarter的重复记录(Name固定,Value可能变化),因此需要获取每个Name各Quarter的最新数据——即对应ID最大的记录。例如表中Quarter 2的重复记录,需提取ID为7、8、9的那组数据。求实现该需求的单条SQL语句。
解决方案
方法1:窗口函数写法(推荐,适配多数现代数据库)
用ROW_NUMBER()窗口函数按Name和Quarter分组,再按ID倒序排序,取每组第一条即可:
SELECT ID, Name, Quarter, Value FROM ( SELECT ID, Name, Quarter, Value, ROW_NUMBER() OVER (PARTITION BY Name, Quarter ORDER BY ID DESC) AS rn FROM your_table_name ) t WHERE rn = 1;
方法2:关联子查询写法(兼容旧版数据库)
先子查询找出每个Name+Quarter组合的最大ID,再关联原表拉取对应记录:
SELECT t1.ID, t1.Name, t1.Quarter, t1.Value FROM your_table_name t1 INNER JOIN ( SELECT Name, Quarter, MAX(ID) AS max_id FROM your_table_name GROUP BY Name, Quarter ) t2 ON t1.Name = t2.Name AND t1.Quarter = t2.Quarter AND t1.ID = t2.max_id;
注意:把语句里的your_table_name替换成你实际的表名就行。两种方法都能精准拿到目标数据,窗口函数写法更简洁好读,子查询则适合不支持窗口函数的老版本数据库。
内容的提问来源于stack exchange,提问作者JDEC
相关产品推荐
相关产品推荐

