移除Union结果集中的部分重复账单数据
解决账单重复数据保留指定来源记录的SQL方案
可行SQL代码
WITH RankedBills AS ( SELECT REF, CUSTOMER, NETT_PRICE, DATE_CREATED, PART_NO, SALESORDER, PROJECT, -- 按重复规则分组,AC来源记录优先排序 ROW_NUMBER() OVER ( PARTITION BY NETT_PRICE, PROJECT, DATE_CREATED ORDER BY CASE WHEN REF = 'AC' THEN 0 ELSE 1 END ) AS RowNum FROM 你的合并表名 -- 替换为实际表名 ) SELECT REF, CUSTOMER, NETT_PRICE, DATE_CREATED, PART_NO, SALESORDER, PROJECT FROM RankedBills WHERE RowNum = 1;
方案逻辑说明
- 分组排序:通过
ROW_NUMBER()函数,以NETT_PRICE、PROJECT、DATE_CREATED为分组依据,给每组内的记录编号。利用CASE WHEN让REF='AC'的记录排在最前面,行号标记为1;同一组内的FP记录行号为2。 - 筛选保留:外层查询仅保留行号为1的记录,自动保留AC来源的重复记录;若组内无AC记录,则保留唯一的FP记录,完全匹配你的需求。
你原有代码的问题
- 无法在
WHERE子句中直接使用ROW_NUMBER()函数,必须先在子查询/CTE中计算行号后再筛选。 - 分区键错误,没有按照你定义的重复规则(
NETT_PRICE、PROJECT、DATE_CREATED)分组。 - 排序规则未优先指定AC来源,导致无法确保AC记录被保留。
内容的提问来源于stack exchange,提问作者Saiyanthou
相关产品推荐
相关产品推荐

