如何在分组查询中为每组获取唯一最新记录(薪资表多分组字段同日期场景)
解决按(code1,code2)分组取最新记录的问题
这个问题很典型——当分组后的记录存在相同支付日期时,单纯按paymonth排序确实没法精准拿到最后录入的那条。咱们可以用窗口函数来完美解决这个需求,具体思路和实现如下:
核心思路
要实现每个code1+code2组合只保留最新的记录,关键是给每个分组内的记录按“新旧程度”排序,然后取每个组的第一条:
- 用
PARTITION BY code1, code2把数据按目标组合分组 - 用
ORDER BY paymonth DESC让每个组内最新的日期排在前面;如果同组内有相同日期的记录,需要额外加一个能判断录入顺序的字段(比如自增主键id、录入时间create_time),按这个字段降序,确保最后录入的记录排在第一位 - 用
ROW_NUMBER()给每个组内的记录编号,编号为1的就是我们要的最新记录
具体SQL实现
假设你的表有一个自增主键id(如果没有的话,可替换为业务上能区分录入顺序的字段):
WITH ranked_salary AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY code1, code2 ORDER BY paymonth DESC, id DESC ) AS rn FROM salary ) SELECT paymonth, code1, code2, payment FROM ranked_salary WHERE rn = 1;
结果验证
针对你提供的测试数据:
| paymonth | code1 | code2 | payment |
|---|---|---|---|
| 01/01/2021 | 11 | 3 | 1000 |
| 01/01/2021 | 11 | 1 | 750 |
| 01/02/2021 | 11 | 3 | 650 |
这个查询会返回:
| paymonth | code1 | code2 | payment |
|---|---|---|---|
| 01/01/2021 | 11 | 1 | 750 |
| 01/02/2021 | 11 | 3 | 650 |
完全符合你的预期:(11,3)组合取了最新的2月记录,(11,1)组合只有一条记录自然被保留。
内容的提问来源于stack exchange,提问作者mlwacosmos
相关产品推荐
相关产品推荐

