如何通过SQL按多条件去重并保留指定Sources数据
解决方案
原SQL的问题在于没有优先筛选出以cmdd开头的记录,且排序逻辑不符合需求——它会把非cmdd开头的记录(比如M3组的91)排在前面,导致最终保留的不是目标值。
要实现需求,我们需要:
- 按
Machine和Product分组 - 优先保留以
cmdd开头的记录,在这些记录中取升序最小的那个 - 剔除分组内其他所有记录(包括非
cmdd开头的)
方法1:查询目标结果(不修改原表)
如果只是需要获取符合要求的数据,不需要删除原表行,可以用以下SQL:
WITH ranked AS ( SELECT Machine, Product, Sources, -- 先标记是否为cmdd开头,cmdd的排前面;再按Sources升序 ROW_NUMBER() OVER ( PARTITION BY Machine, Product ORDER BY CASE WHEN Sources LIKE 'cmdd%' THEN 0 ELSE 1 END, Sources ASC ) AS rn FROM Concatcleanup ) SELECT Machine, Product, Sources FROM ranked WHERE rn = 1;
方法2:删除原表中不符合的行
如果需要直接清理原表数据,保留目标行,可以用CTE标记后删除:
WITH ranked AS ( SELECT Machine, Product, Sources, ROW_NUMBER() OVER ( PARTITION BY Machine, Product ORDER BY CASE WHEN Sources LIKE 'cmdd%' THEN 0 ELSE 1 END, Sources ASC ) AS rn FROM Concatcleanup ) DELETE FROM ranked WHERE rn > 1;
逻辑说明
CASE WHEN Sources LIKE 'cmdd%' THEN 0 ELSE 1 END:把所有以cmdd开头的记录的排序权重设为0,非cmdd的设为1,确保cmdd记录优先被保留- 再按
Sources ASC排序,在cmdd开头的记录里取字典序最小的(比如cmdd3比cmdd6小) - 每个
Machine+Product分组里只保留rn=1的行,就是我们需要的目标记录
内容的提问来源于stack exchange,提问作者ROn
相关产品推荐
相关产品推荐

