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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:55:29