Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当值从0更改为1时,是否可以启动新组?_Sql_Tsql - Fatal编程技术网

Sql 当值从0更改为1时,是否可以启动新组?

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

当T-SQL中的列中的值发生变化时,我是否可以为行分配一个新组

如果您能提供无需CTE和功能的无限重复号码解决方案,我将不胜感激。我做了一个解决方案,用100个连续相同的数字来计算

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