Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:有没有办法找到重复项并用大小写将它们标记为新列_Sql_Duplicates_Case_Impala_Hue - Fatal编程技术网

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”的行如何根据您的条件具有不同的标志值。