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

SQL Server左连接中如何获取cd.Id2唯一结果,仅保留首条重复记录

SQL Server:按Id2去重并保留每组第一条记录

需求

Data表查询结果中存在重复的Id2记录,需确保每个Id2值唯一,仅保留每组重复Id2对应的第一条记录;同时需要关联StartBalanceData表计算聚合字段。

当前问题

原SQL语句尝试通过分组聚合实现,但无法按Id2去重;使用LIMIT 1不符合SQL Server语法,无法达成需求。原SQL如下:

SELECT Id
       ,IsIncluded
       ,LineId
       ,LineType
       ,LineNumber
       ,LineDescription
       ,SUM(table2.StartBalance) AS StartBalance
       ,SUM(table1.MoneyIn) AS MoneyIn
       ,SUM(table1.MoneyOut) AS MoneyOut
FROM Data AS table1
LEFT JOIN StartBalanceData table2 ON table1.Id2 = table2.Id
GROUP BY Id, IsIncluded, LineId, LineType, LineNumber, LineDescription

解决方案

使用SQL Server的ROW_NUMBER()窗口函数实现分组取第一条的逻辑,具体步骤:

  1. 先对Data表按Id2分组,给每组内的记录按指定顺序分配行号
  2. 筛选行号为1的记录(即每组第一条),再关联表计算聚合值

完整SQL代码

WITH RankedData AS (
    SELECT 
        Id,
        IsIncluded,
        LineId,
        LineType,
        LineNumber,
        LineDescription,
        Id2,
        MoneyIn,
        MoneyOut,
        -- 按Id2分组,每组内按Id升序排序,第一条行号为1
        ROW_NUMBER() OVER (PARTITION BY Id2 ORDER BY Id) AS RowNum
    FROM Data
)
SELECT 
    rd.Id,
    rd.IsIncluded,
    rd.LineId,
    rd.LineType,
    rd.LineNumber,
    rd.LineDescription,
    SUM(table2.StartBalance) AS StartBalance,
    SUM(rd.MoneyIn) AS MoneyIn,
    SUM(rd.MoneyOut) AS MoneyOut
FROM RankedData rd
LEFT JOIN StartBalanceData table2 ON rd.Id2 = table2.Id
WHERE rd.RowNum = 1 -- 仅保留每组Id2的第一条记录
GROUP BY rd.Id, rd.IsIncluded, rd.LineId, rd.LineType, rd.LineNumber, rd.LineDescription

关键说明

  • PARTITION BY Id2:将相同Id2的记录划分为同一组
  • ORDER BY Id:指定每组内的排序规则,这里以Id升序确保取最早的一条记录,可根据实际业务调整排序字段(如创建时间等)
  • WHERE rd.RowNum = 1:筛选出每组的第一条记录,实现Id2值唯一的要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:41:16