SQL分组获取每组首条结果异常:ROW_NUMBER()使用问题求助
问题:按分组获取首条记录失败
我使用以下SQL查询想要获取每组的首条记录,已使用ROW_NUMBER()函数,但仍返回每组的所有记录,求指导达成预期输出。
原查询语句
WITH CTE_SUM AS ( SELECT FA.AuditIntID, FA.FileIntID, MAX(FA.AuditDate) AS Auditdaa, ROW_NUMBER() OVER (PARTITION BY FA.AuditIntID ORDER BY FA.AuditIntID DESC) AS rn FROM DBO.Audit FA WITH (NOLOCK) WHERE FA.FirmIntID = 1 GROUP BY FA.AuditIntID, FA.FileIntID ) SELECT CS.AuditIntID, MDC.EntityIntID, CS.Auditdaa, CS.fileintid, cs.rn FROM CTE_SUM CS WITH (NOLOCK) INNER JOIN [DBO].[Meta] MDC ON MDC.FileIntID = CS.FileIntID WHERE rn = 1 ORDER BY MDC.EntityIntID,CS.Auditdaa DESC
当前输出结果
| EntityIntID | Auditdaa | fileintid | rn |
|---|---|---|---|
| 1 | 7/28/23 12:53 | 160051 | 1 |
| 1 | 7/27/23 9:49 | 380075 | 1 |
| 1 | 6/27/23 10:06 | 310073 | 1 |
| 1 | 6/27/23 9:48 | 310073 | 1 |
| 1 | 6/27/23 9:48 | 310073 | 1 |
| 1 | 6/27/23 9:46 | 310073 | 1 |
| 2 | 7/4/23 5:42 | 320072 | 1 |
| 2 | 6/27/23 11:25 | 310074 | 1 |
| 2 | 6/27/23 11:24 | 310074 | 1 |
| 2 | 6/27/23 11:23 | 140050 | 1 |
| 2 | 6/27/23 10:43 | 310074 | 1 |
| 2 | 6/27/23 10:43 | 310074 | 1 |
| 2 | 6/27/23 10:43 | 310074 | 1 |
| 2 | 6/27/23 9:44 | 310072 | 1 |
| 2 | 6/26/23 19:15 | 300073 | 1 |
| 2 | 6/26/23 19:13 | 300073 | 1 |
| 2 | 6/26/23 19:12 | 300073 | 1 |
| 2 | 6/26/23 19:09 | 120036 | 1 |
| 2 | 6/26/23 19:09 | 300073 | 1 |
| 2 | 6/26/23 19:09 | 300073 | 1 |
| 2 | 6/26/23 19:08 | 300073 | 1 |
| 2 | 6/26/23 19:08 | 120036 | 1 |
预期输出结果
| EntityIntID | Auditdaa | fileintid | rn |
|---|---|---|---|
| 1 | 7/28/23 12:53 | 160051 | 1 |
| 2 | 7/4/23 5:42 | 320072 | 1 |
问题分析与修正
原查询的核心问题是分区逻辑错误:ROW_NUMBER()按AuditIntID分区,而实际需要按EntityIntID分组。同时原GROUP BY的逻辑和分组需求不匹配,导致每个AuditIntID+FileIntID组合都被标记为rn=1,过滤后仍返回大量记录。
修正后的查询如下:
WITH CTE_Ranked AS ( SELECT FA.AuditIntID, FA.FileIntID, FA.AuditDate AS Auditdaa, MDC.EntityIntID, -- 按EntityIntID分区,按AuditDate降序排列,每组最新记录rn=1 ROW_NUMBER() OVER (PARTITION BY MDC.EntityIntID ORDER BY FA.AuditDate DESC) AS rn FROM DBO.Audit FA WITH (NOLOCK) -- 先关联Meta表获取EntityIntID,确保能按目标字段分组 INNER JOIN [DBO].[Meta] MDC ON MDC.FileIntID = FA.FileIntID WHERE FA.FirmIntID = 1 ) SELECT AuditIntID, EntityIntID, Auditdaa, FileIntID, rn FROM CTE_Ranked WHERE rn = 1 ORDER BY EntityIntID, Auditdaa DESC
修正说明
- 提前关联
Meta表,直接获取EntityIntID,确保分区逻辑符合需求。 - 将ROW_NUMBER()的
PARTITION BY改为MDC.EntityIntID,实现按Entity分组编号。 - 按
FA.AuditDate DESC排序,保证每组中最新的记录被标记为rn=1。 - 移除原查询中的GROUP BY,因为原分组逻辑会破坏需要的记录排序关系。
内容的提问来源于stack exchange,提问作者Sanjay Nakate
相关产品推荐
相关产品推荐

