如何去除重复记录?SQL查询去重需求求助
解决SQL查询中Name字段唯一的问题
看起来你现在的核心问题是原查询里ROW_NUMBER的分区条件包含了Name和gwtxid两个字段,这会导致每一组Name+gwtxid的组合都会生成number=1的记录,所以才会出现同一个Name对应多条结果的情况。咱们来调整一下查询逻辑,实现Name唯一的需求:
方案1:每个Name保留一条任意(或最新)的gwtxid记录
如果你的目标是每个Name只出现一次,对应一条gwtxid(比如取关联订单中最新的那条记录),可以把ROW_NUMBER的分区条件改成只按Name分组,排序条件保持按order_id desc即可:
;with tbl as ( select ROW_NUMBER() over(partition by oi.Name order by o.order_id desc) as number, isnull(oi.Name,'') AS Name, isnull(T.gwtxid,'') as gwtxid FROM ORDERS o INNER JOIN ORDERITEMS oi on o.Order_ID=oi.Order_ID left JOIN PAYMENTS P on p.Order_ID=o.Order_ID left JOIN TRANSACTIONS T ON T.Transaction_ID=P.Transaction_ID WHERE O.TOTALCHARGES>0 and o.OrderNumber is not null and o.Order_ID=195180046 ) select Name, gwtxid from tbl where number=1
这个查询会给每个Name下的记录按order_id倒序排号,只取每组的第一条,这样就保证了Name的唯一性,gwtxid会取该Name对应最新订单的关联值。如果想优先选择非空的gwtxid,可以调整排序条件:
ROW_NUMBER() over(partition by oi.Name order by case when T.gwtxid is not null then 0 else 1 end, o.order_id desc) as number
方案2:合并每个Name对应的所有gwtxid
如果你想保留每个Name对应的所有gwtxid,同时保证Name唯一,可以用字符串聚合函数(以SQL Server 2017+为例,用STRING_AGG):
select isnull(oi.Name,'') AS Name, STRING_AGG(isnull(T.gwtxid,''), ', ') as gwtxids FROM ORDERS o INNER JOIN ORDERITEMS oi on o.Order_ID=oi.Order_ID left JOIN PAYMENTS P on p.Order_ID=o.Order_ID left JOIN TRANSACTIONS T ON T.Transaction_ID=P.Transaction_ID WHERE O.TOTALCHARGES>0 and o.OrderNumber is not null and o.Order_ID=195180046 GROUP BY oi.Name
这个查询会把每个Name对应的所有gwtxid用逗号拼接成一个字段,既保证Name唯一,又能看到所有关联的gwtxid。
这两种方案都能满足你提出的需求,你可以根据实际场景选择合适的一种~
内容的提问来源于stack exchange,提问作者Mitesh Jain




