我有一个包含列MachineProductSources的表:

Machine Product Sources
M3 H cmdd6
M3 H 91
M3 H cmdd3
M4 I cmdd7
M4 J cmdd7
M4 B 827
M4 B cmdd7

在上表中,Machine是M3,乘积相同,但Sources列有多个进气口.因此,需要删除Sources应始终以‘cmdd’为升序的重复行.

例如,如果产品有重复,而源不同,即‘cmdd6’或‘cmdd3’,则应删除重复行,而值将保留在源‘cmdd3’中.

下面是表中希望实现的结果

Machine Product Sources
M3 H cmdd3
M4 I cmdd7
M4 J cmdd7
M4 B cmdd7

下面是我试图删除Count>1的值上的重复项的查询.

WITH CTE(Machine, Product,Sources, duplicatecount) AS 
(
    SELECT 
        Machine, Product, Sources, 
        ROW_NUMBER() OVER (PARTITION BY Machine, Product
                           ORDER BY Machine, Sources) AS DuplicateCount
    FROM 
        Concatcleanup 
)
DELETE FROM cte
WHERE duplicatecount > 1

如有任何帮助,我们将非常感激.

推荐答案

您可以在ORDER BY子句ROW_NUMBER窗口函数中使用一个额外的特制字段,将类似"cmdd%"的值置于所有其他值之上.

WITH cte AS (
    SELECT *,
           ROW_NUMBER() OVER(
               PARTITION BY Machine, Product
               ORDER BY CASE WHEN Sources NOT LIKE 'cmdd%' THEN 1 END,
                        Sources
           ) AS DuplicateCount                 
    FROM Concatcleanup
)
DELETE FROM cte
WHERE DuplicateCount > 1;

查看演示here.


如果希望避免删除,可以使用符号SELECT ... INTO <new_table> FROM ...并使用CTE的代码:

SELECT Machine, Product, Sources,  
       ROW_NUMBER() OVER(
           PARTITION BY Machine, Product
           ORDER BY CASE WHEN Sources NOT LIKE 'cmdd%' THEN 1 END,
                    Sources
       ) AS DuplicateCount
INTO newtab
FROM Concatcleanup;

查看演示here.

Sql相关问答推荐

如何在VB.NET中使用MS SYS根据开始和结束期间日期进行查询

Oracle中的分层查询

如何重用表值用户定义函数调用的结果?

将SEMI JOIN、ANTI JOIN转换为非连接SQL

SQL(PostgreSQL)从条件创建点表

如何在Snowflake SQL存储过程中传递LIMIT和OFFSET的参数?

在Postgres,什么是;.USSTZ;在';YYYY-MM-DD;T;HH24:MI:SS.USSTZ';?

当 ansible 变量未定义或为空时,跳过 sql.j2 模板中的 DELETE FROM 查询

如何在Hive SQL中分别按多列进行分组?

SQL 查询是否返回列表中仅包含某些值而不包含其他值的行?

SQL Select 字母范围没有给我任何东西

INSERT INTO 语法

SQL 多个不满足的条件失败

如何根据共同列值从两个表中包含列,但只包含左表中的行

如何在 ClickHouse SQL 中使用 CTE 将邻居语句中的数字作为偏移量传递?

计算 SQL 中的总体成功率:递归 CTE 还是替代方法?

如何筛选 GROUP BY 结果? HAVING 没有产生预期的结果

使用 SQL 表中的连接列删除重复记录

如何刷新在视图之上创建的表

在 UTF 编码字符上应用 SQL LIKE 语句没有给出任何结果