求助:使用ROW_NUMBER()去重时所有行序号均为1的问题
问题原因及解决方法
你的问题出在PARTITION BY的列组合上:你用DepositorOrderNumber、转换后的DWH_INSERT_DATE、LineSequenceNumber三个列作为分组依据,而这三个列的组合在你的数据里是完全唯一的——每一行的这三个值都不重复,所以每个分组里只有1行数据,ROW_NUMBER()自然全返回1。
解决步骤
- 明确重复判定规则:先确定到底哪些列值相同才算“重复数据”?比如是
DepositorOrderNumber + LineSequenceNumber重复就算,还是其他列组合? - 调整PARTITION BY子句:只把构成重复的列放在PARTITION BY里,比如如果是按订单号+行号去重,就只保留这两个列。
- 指定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
相关产品推荐
相关产品推荐

