SQL :有没有办法找到重复项并将它们标记为带有大小写的新列

SQL : Is there any way to find Duplicates and flag them as new column with case

我试图在 table 中查找重复项并想添加一个新的标志列。 以下示例数据:

Column A        Column B
1                888
1                999
1                777
1                777
2                444
2                444
3                555
4                222
-5               333
-5               672
-5               045        

期望的输出:

Column A        Column B         Flag_output
1                888              DUPLICATE
1                999              DUPLICATE
1                777              NULL
1                777              NULL
2                444              NULL
2                444              NULL
3                555              NULL
4                222              NULL
-5               333              DUPLICATE
-5               672              DUPLICATE
-5               045              DUPLICATE

情况1:当A列的值相同而B列的值不同时(例如A列的值1) -应标记为 DUPLICATE

case 2:当Column A 的值与Column B 的值在多行中相同时(例如value 2 in A 列 - 应标记为 NULL

情况3:当A列和B列有唯一值时(例如值34[= A 列中的 33=] - 也应标记为 NULL

如有任何帮助,我们将不胜感激。

根据您的描述,我可以将您的条件描述为当 b 的最小值和最大值与 a 不同时,然后标记为 'duplicate'

为此,使用 window 函数:

select t.*,
       (case when min(b) over (partition by a) <> max(b) over (partition by a)
             then 'duplicate'
        end) as flag_output
from t;

根据数据,您似乎想要:

select t.*,
       (case when count(*) over (partition by a, b) = 1 and
                  count(*) over (partition by a) > 1
             then 'duplicate'
        end) as flag_output
from t;

也就是说,仅当 a 有多个值时才标记单例值。

编辑: @Gordon Linoff 我正在打字。一定要先尝试他的解决方案,因为它可能比这个更高效。


鉴于以下情况:

A   | B
--- | ---
1   | 888   
1   | 999
1   | 777
1   | 777

你是第一次遇到A=1,所以不能是DUPLICATE,必须是NULL

A   | B   | Result
--- | --- | ---
1   | 888 | NULL     
1   | 999 |
1   | 777 | 
1   | 777 | 

然后您会第二次遇到 A=1,并且 B 的值不同。这将两行标记为 DUPLICATE.

A   | B   | Result
--- | --- | ---
1   | 888 | DUPLICATE   
1   | 999 | DUPLICATE
1   | 777 | 
1   | 777 | 

A=1 有第三个实例,它还有一个不同的值 B。三个都是DUPLICATEs.

A   | B   | Result
--- | --- | ---
1   | 888 | DUPLICATE   
1   | 999 | DUPLICATE
1   | 777 | DUPLICATE
1   | 777 | 

你第四次看到 A=1 它有一个你之前看到的 B 的值 (B=777),它将两行标记为 NULL

A   | B   | Result
--- | --- | ---
1   | 888 | DUPLICATE   
1   | 999 | DUPLICATE
1   | 777 | NULL
1   | 777 | NULL

我的解决方案计算 table 中每个 A 值的实例以及每个 A, B 对的匹配数。这些子结果与主要 table 相结合以获得您的结果。 Try it out.

架构

CREATE TABLE Sample (A int, B int)

查询

SELECT s.A, s.B,
  CASE 
    WHEN m.Matches > 1 THEN NULL
    WHEN i.Instances = 1 THEN NULL
    ELSE 'DUPLICATE'    
  END AS Result
FROM Sample s 
  INNER JOIN (SELECT A, COUNT(*) AS Instances FROM Sample GROUP BY A) i
    ON s.A = i.A
  INNER JOIN (SELECT A, B, COUNT(*) AS Matches FROM Sample GROUP BY A, B) m
    ON s.A = m.A AND s.B = m.B
ORDER BY A, B