如何解决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 列中的值 3 和 4) - 也应该是标记为NULL
任何帮助将不胜感激。
解决方法
根据您的描述,我可以将您的条件表述为当 b
的 a
的最小值和最大值不同时,然后标记为 '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 举报,一经查实,本站将立刻删除。