найти повторяющуюся строку и пометить первую строку как 1, а оставшиеся повторяющиеся строки 0 - PullRequest
0 голосов
/ 02 мая 2018

У меня есть данные ниже в моей таблице,

COL1  COL2

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

Я хочу получить вышеуказанные данные с дополнительным флагом, например, флаг должен быть 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 голосов
/ 02 мая 2018

В таблице или группе строк не существует такой вещи, как «первая строка» - если только у вас нет столбца, в котором указан порядок. Таблицы 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   
0 голосов
/ 02 мая 2018

Вы можете попробовать этот запрос.

с использованием 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

...