SQL:有没有办法找到重复项并用大小写将它们标记为新列
我试图在表中查找重复项,并希望添加一个新的标志列。 样本数据如下:SQL:有没有办法找到重复项并用大小写将它们标记为新列,sql,duplicates,case,impala,hue,Sql,Duplicates,Case,Impala,Hue,我试图在表中查找重复项,并希望添加一个新的标志列。 样本数据如下: Column A Column B 1 888 1 999 1 777 1 777 2 444 2 444 3 555 4 222 -5 333 -5
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)-应标记为重复
情况2:当A列的值与B列中多行的值相同时(例如A列中的值2)-应标记为空
情况3:当A列和B列具有唯一值(例如A列中的值3和4)时,也应标记为空
任何帮助都将不胜感激。根据您的描述,我可以将您的条件表述为
a
的b
最小值和最大值不同,然后标记为'replicate'
为此,请使用窗口功能:
select t.*,
(case when min(b) over (partition by a) <> max(b) over (partition by a)
then 'duplicate'
end) as flag_output
from t;
也就是说,仅当
a
编辑有多个值时才标记单例值:@Gordon Linoff,而我正在键入。一定要先尝试他的解决方案,因为它可能比这更有效
鉴于以下情况:
A | B
--- | ---
1 | 888
1 | 999
1 | 777
1 | 777
您将第一次遇到A=1
,因此它不能是重复的并且必须是NULL
A | B | Result
--- | --- | ---
1 | 888 | NULL
1 | 999 |
1 | 777 |
1 | 777 |
A | B | Result
--- | --- | ---
1 | 888 | DUPLICATE
1 | 999 | DUPLICATE
1 | 777 | NULL
1 | 777 | NULL
然后您将第二次遇到A=1
的值不同的B
。这会将两行标记为重复
A | B | Result
--- | --- | ---
1 | 888 | DUPLICATE
1 | 999 | DUPLICATE
1 | 777 |
1 | 777 |
第三个实例是a=1
,它还有一个不同的值B
。这三个都是重复的
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 | NULL
1 | 999 |
1 | 777 |
1 | 777 |
A | B | Result
--- | --- | ---
1 | 888 | DUPLICATE
1 | 999 | DUPLICATE
1 | 777 | NULL
1 | 777 | NULL
我的解决方案统计表中A
的每个值的实例,以及每个A,B
对的匹配数。这些子结果将连接到主表以获取结果
模式
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
我不明白“1”的行如何根据您的条件具有不同的标志值。