找到重复的行并将第一行标记为1并保留重复的行0

时间:2018-05-01 21:16:08

标签: sql oracle duplicates row-number

我在表格中有以下数据,

COL1  COL2

A      X  
A      Y  
A      Z  
B      W  
B      W  
C      L  
C      L  

我想用一个额外的标志来获取上面的数据,例如,对于唯一列值,flag应为1,并且第一次出现的重复应为1,剩余的重复行为0, 预期产出:

COL1  COL2   FLAG  
A      X     1  
A      Y     1  
A      Z     1  
B      W     1   -- First occurance  
B      W     0   -- Second occurance  
C      L     1   -- First occurance  
C      L     0   -- Second occurance 

我知道row_number()over(由COL1,COL2分区)将返回如下所示的计数,

COL1   COL2   FLAG  
A       X     1  
A       Y     1     
A       Z     1    
B       W     2    
B       W     2   
C       L     3  
C       L     3   

但这不是我想要的。第二次出现的相同列值应该归为0

提前致谢!

2 个答案:

答案 0 :(得分:5)

您可以尝试此查询。

使用CASE WHEN表达式检查rn是否大于1

SELECT t.COL1,t.COL2,CASE WHEN rn = 1 THEN 1 ELSE 0 END "FLAG"
FROM (
 SELECT *,row_number() over(partition by COL1,COL2 ORDER BY COL1) rn
 FROM T
) as t

<强>结果

enter image description here

Sqlfiddle

答案 1 :(得分:3)

在表或一组行中没有“第一行”这样的东西 - 除非你有一个指定排序的列。 SQL表代表无序集。

这将有效:

select t.*,
       (case when 1 = row_number() over (partition by col1, col2 order col2)
             then 1 else 0
        end) as flag
from t;

如果您没有订购列,那么您可以为其余的任意行分配值“1”和“0”。

顺便说一下,你误解了row_number()。你将它与dense_rank() over (order by col1)混淆了。您的表达式row_number() over (partition by COL1, COL2)将返回:

COL1   COL2   FLAG  
A       X     1  
A       Y     1     
A       Z     1    
B       W     1    
B       W     2   
C       L     1  
C       L     2