Sql 基于两列查找重复项的查询

Sql 基于两列查找重复项的查询,sql,db2,Sql,Db2,我有一个场景,我们需要根据两个不同的列识别重复记录。例如,如果COLA中存在重复记录,则不应考虑这些记录,COLB的情况也是如此。但是在重复的时候,我们不应该把可乐和可乐放在一起。副本应单独考虑。我的输入表如下所示 输入表 预期产出 我正在考虑使用两个单独的查询编写一个分组查询,然后进行联合。但我只想检查其他任何简单的方法来找到它。您可以使用窗口功能: select t.* from (select t.*, count(*) over (partition by c

我有一个场景,我们需要根据两个不同的列识别重复记录。例如,如果COLA中存在重复记录,则不应考虑这些记录,COLB的情况也是如此。但是在重复的时候,我们不应该把可乐和可乐放在一起。副本应单独考虑。我的输入表如下所示

输入表

预期产出


我正在考虑使用两个单独的查询编写一个分组查询,然后进行联合。但我只想检查其他任何简单的方法来找到它。

您可以使用窗口功能:

select t.*
from (select t.*, 
             count(*) over (partition by cola) as cola_cnt,
             count(*) over (partition by colb) as colb_cnt
      from table t
     ) t
where cola_cnt = 1 and colb_cnt = 1;

我们可以在这里尝试使用exists逻辑:

SELECT COLA, COLB, COLD
FROM yourTable t1
WHERE
    NOT EXISTS (SELECT 1 FROM yourTable t2
                WHERE (t2.COLA = t1.COLA AND t2.PK <> t1.PK) OR
                      (t2.COLB = t1.COLB AND t2.PK <> t1.PK));

这里我假设您的表有一些主键列PK。如果没有,请添加它。假设COLD值总是唯一的,您可能可以使用COLD代替PK。

这适用于您的场景

select COLA,COLB,COLD  from test 
where COLB not in (select COLB  from test group by COLB having (count(COLB) >1))
group by COLA having (count(COLA) =1);