我有类似的源数据
cl1 cl2 cl3 No
A A1 AA1 1
A A1 AA1 2
A A1 AA1 3
B B1 BB1 4
B B1 BB1 5
B B1 BB1 6
B B1 BB1 7
C C1 CC1 9
C C1 CC1 10
C C1 CC1 11
D D1 DD1 12
结果应该是这样的
cl1 cl2 cl3 No Flag
A A1 AA1 1 1
A A1 AA1 2 0
A A1 AA1 3 0
B B1 BB1 4 1
B B1 BB1 5 0
B B1 BB1 6 0
B B1 BB1 7 0
C C1 CC1 9 1
C C1 CC1 10 0
C C1 CC1 11 0
D D1 DD1 12 1
组中的每个项都应有一个值为1的1标志,该组中的其他标志项设置为0。根据cl1、cl2、cl3分组,但";否";字段应包含在结果中。
我不知道如何在SQL中做到这一点。
使用row_number()
:
select t.*,
(case when row_number() over (partition by a, a1, aa1 order by no) = 1
then 1 else 0
end) as flag
from t;
如果需要设置no
,则使用子查询。您的行没有指定的排序,但您可以执行以下操作:
select t.*,
(case when row_number() over (partition by a, a1, aa1 order by no) = 1
then 1 else 0
end) as flag
from (select t.*,
row_number() over (order by a, a1, a2) as no
from t
) t;