Sql 当值从0更改为1时,是否可以启动新组?
当T-SQL中的列中的值发生变化时,我是否可以为行分配一个新组 如果您能提供无需CTE和功能的无限重复号码解决方案,我将不胜感激。我做了一个解决方案,用100个连续相同的数字来计算Sql 当值从0更改为1时,是否可以启动新组?,sql,tsql,Sql,Tsql,当T-SQL中的列中的值发生变化时,我是否可以为行分配一个新组 如果您能提供无需CTE和功能的无限重复号码解决方案,我将不胜感激。我做了一个解决方案,用100个连续相同的数字来计算 coalesce(lag()over(), lag() over(), lag() over() ) - it is too bulky 但无法解决连续相同数字数量不限的情况 资料 期望 id somevalue group 1 0 1 2 1
coalesce(lag()over(), lag() over(), lag() over() ) - it is too bulky
但无法解决连续相同数字数量不限的情况
资料
期望
id somevalue group
1 0 1
2 1 2
3 1 2
4 0 3
5 0 3
6 1 4
7 1 4
8 1 4
9 0 5
10 0 5
11 1 6
12 0 7
13 1 8
14 1 8
15 0 9
16 0 9
如果您只需要组标识符,可以使用:
select t.*,
min(id) over (partition by some_value, seqnum - seqnum_1) as grp
from (select t.*,
row_number() over (order by id) as seqnum,
row_number() over (partition by somevalue order by id) as sequm_1
from t
) t;
如果你想列举它们。好的,您可以使用稠密秩枚举上面的id。或者,您可以使用滞后和累积总和:
select t.*,
sum(case when some_value = prev_sv then 0 else 1 end) over (order by id) as grp
from (select t.*,
lag(somevalue) over (order by id) as prev_sv
from t
) t;
这里有一种不同的方法: 首先,我创建了一个视图,以提供每行的组增量:
create view increments as
select
n2.id,n2.somevalue,
case when n1.somevalue=n2.somevalue then 0 else 1 end as increment
from
(select 0 as id,1 as somevalue union all select * from mytable) n1
join mytable n2
on n2.id = n1.id+1
然后,我使用此视图生成组值作为增量的累积和:
select id, somevalue,
(select sum(increment) from increments i1 where i1.id <= i2.id)
from increments i2
谢谢,戈登。答案的第二部分是我所需要的。“选择t.*”后需要逗号
select id, somevalue,
(select sum(increment) from increments i1 where i1.id <= i2.id)
from increments i2