微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL:有什么方法可以找到重复项并将它们标记为带有大小写的新列

如何解决SQL:有什么方法可以找到重复项并将它们标记为带有大小写的新列

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

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

情况 2:当 A 列的值与 B 列中多行的值相同时(例如 A 列中的值 2) - 应标记为空

情况 3:当 A 列和 B 列具有唯一值(例如 A 列中的值 34) - 也应该是标记为NULL

任何帮助将不胜感激。

解决方法

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

为此,使用窗口函数:

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 answered 在我打字时。一定要先尝试他的解决方案,因为它的性能可能比这更高。


鉴于以下内容:

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 值。这三个都是 DUPLICATE

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

我的解决方案计算表中每个 A 值的实例以及每个 A,B 对的匹配数。这些子结果被连接到主表以获得您的结果。 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。