You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何去除重复记录?SQL查询去重需求求助

解决SQL查询中Name字段唯一的问题

看起来你现在的核心问题是原查询里ROW_NUMBER的分区条件包含了Namegwtxid两个字段,这会导致每一组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

火山引擎 最新活动