You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

当前输出结果

EntityIntIDAuditdaafileintidrn
17/28/23 12:531600511
17/27/23 9:493800751
16/27/23 10:063100731
16/27/23 9:483100731
16/27/23 9:483100731
16/27/23 9:463100731
27/4/23 5:423200721
26/27/23 11:253100741
26/27/23 11:243100741
26/27/23 11:231400501
26/27/23 10:433100741
26/27/23 10:433100741
26/27/23 10:433100741
26/27/23 9:443100721
26/26/23 19:153000731
26/26/23 19:133000731
26/26/23 19:123000731
26/26/23 19:091200361
26/26/23 19:093000731
26/26/23 19:093000731
26/26/23 19:083000731
26/26/23 19:081200361

预期输出结果

EntityIntIDAuditdaafileintidrn
17/28/23 12:531600511
27/4/23 5:423200721

问题分析与修正

原查询的核心问题是分区逻辑错误: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

修正说明

  1. 提前关联Meta表,直接获取EntityIntID,确保分区逻辑符合需求。
  2. 将ROW_NUMBER()的PARTITION BY改为MDC.EntityIntID,实现按Entity分组编号。
  3. 按FA.AuditDate DESC排序,保证每组中最新的记录被标记为rn=1。
  4. 移除原查询中的GROUP BY,因为原分组逻辑会破坏需要的记录排序关系。

内容的提问来源于stack exchange,提问作者Sanjay Nakate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 03:48:10