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()窗口函数实现分组取第一条的逻辑,具体步骤:
- 先对Data表按
Id2分组,给每组内的记录按指定顺序分配行号 - 筛选行号为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
相关产品推荐
相关产品推荐

