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

求助:使用ROW_NUMBER()去重时所有行序号均为1的问题

问题原因及解决方法

你的问题出在PARTITION BY的列组合上:你用DepositorOrderNumber、转换后的DWH_INSERT_DATE、LineSequenceNumber三个列作为分组依据,而这三个列的组合在你的数据里是完全唯一的——每一行的这三个值都不重复,所以每个分组里只有1行数据,ROW_NUMBER()自然全返回1。

解决步骤

  1. 明确重复判定规则:先确定到底哪些列值相同才算“重复数据”?比如是DepositorOrderNumber + LineSequenceNumber重复就算,还是其他列组合?
  2. 调整PARTITION BY子句:只把构成重复的列放在PARTITION BY里,比如如果是按订单号+行号去重,就只保留这两个列。
  3. 指定ORDER BY逻辑:在ORDER BY里选一个能区分重复行的列(比如日期先后、主键ID等),用来决定保留哪一行(比如最新插入的,或者最早的)。

修改后的示例代码

假设你想按DepositorOrderNumber和LineSequenceNumber去重,保留最新插入的行:

WITH cte AS
(
    SELECT 
        ROW_NUMBER() OVER (
            PARTITION BY DepositorOrderNumber, LineSequenceNumber 
            ORDER BY CAST(DWH_INSERT_DATE AS datetime) DESC
        ) AS Row_Num,
        DepositorOrderNumber, 
        LineSequenceNumber, 
        CAST(DWH_INSERT_DATE AS datetime) AS InsertDate
    FROM 
        [Jda].[DM_Fact_940_OrderLineItem]
    WHERE
        Depot_Slicer_Name = 'Depot DC' 
)
SELECT *
FROM cte
WHERE Row_Num = 1 AND DepositorOrderNumber = '557083'

验证重复是否存在

你可以先跑下面的SQL,确认原表中是否真的存在你认为的重复数据:

SELECT DepositorOrderNumber, CAST(DWH_INSERT_DATE AS datetime), LineSequenceNumber, COUNT(*)
FROM [Jda].[DM_Fact_940_OrderLineItem]
WHERE Depot_Slicer_Name = 'Depot DC' AND DepositorOrderNumber = '557083'
GROUP BY DepositorOrderNumber, CAST(DWH_INSERT_DATE AS datetime), LineSequenceNumber
HAVING COUNT(*) > 1

如果这个查询没有返回结果,说明你之前认定的重复列组合其实没有重复,得重新梳理重复判定规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:03:17