在SQL中计算连续重复的值

8

我有一张表格如下所示:

ID     OrdID     Value
1      1          0     
2      2          0
3      1          1
4      2          1
5      1          1
6      2          0
7      1          0
8      2          0
9      2          1
10     1          0
11     2          0

我希望获得连续值为0的计数。使用上述示例,结果将为3(第6行,第7行和第8行)。我正在使用SQL Server 2008 R2。


请详细解释一下。我不确定您所指的“连续”是指什么以及如何。您是否指重复序列? - Tanner
第一行和第二行不是都有连续的0吗? - Jt2ouan
@BS123:我猜他只想要最大计数。 - Tim Schmelter
是的,最大计数。谢谢。 - abeuwe
2个回答

10
我假设 id 是唯一且递增的。您可以通过使用行号之差获取连续值的计数。以下计算所有序列:
select grp, value, min(id), max(id), count(*) as cnt
from (select t.*,
             (row_number() over (order by id) - row_number() over (partition by value order by id)
             ) as grp
      from table t
     ) t
group by grp, value;

如果你想要最长的0序列:
select top 1 grp, value, min(id), max(id), count(*) as cnt
from (select t.*,
             (row_number() over (order by id) - row_number() over (partition by value order by id)
             ) as grp
      from table t
     ) t
group by grp, value
having value = 0
order by count(*) desc

1
很好。还应该有一个LAG函数可用,类似于这些窗口函数。 - Randy
你好,你是正确的,ID是递增的(主键)。当我在SQL Fiddle中尝试你的脚本时,我收到了以下错误信息:“关键字'table'附近的语法不正确:select grp,value,min(id),max(id),count()as cnt from(select test。,(row_number()over(order by id)- row_number()over(partition by value order by id))as grp from table test)test group by grp,value”。 - abeuwe
好的,在获取grp的值之后,有一个额外的关键字Table。如果你把它移除掉,它似乎可以完美地工作。谢谢Gordon Linoff。 - abeuwe
@abeuwe . . . “table” 只是你的表格的名称。 - Gordon Linoff

4
使用 not exists 查找连续的0的查询
select top 1 min(t2.id), max(t2.id), count(*)
from mytable t
join mytable t2 on t2.id <= t.id
where not exists (
    select 1 from mytable t3
    where t3.id between t2.id and t.id
    and t3.value <> 0
)
group by t.id
order by count(*) desc 

http://sqlfiddle.com/#!3/52989/3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接