在SQL中,每组仅设置一项标志



我有类似的源数据

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;

最新更新