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列有唯一值时(例如值3和4[= 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
。三个都是DUPLICATE
s.
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
我试图在 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列有唯一值时(例如值3和4[= 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
。三个都是DUPLICATE
s.
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