我在表格中有以下数据,
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
提前致谢!
答案 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
<强>结果强>
答案 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