2017-09-19 65 views
2

使用SQL Server 2016.计数行但保留重复值为相同的计数

我一直被困在一个星期的SQL问题上,并决定将问题分解成部分。我解决了一个部分,但有这个问题。我的数据集很大,但它的一个样本是

state | duration | time 
    ------+----------+-------------------------- 
     1 | 28.29 | 2017-08-09 00:00:22.460 
     1 | 10.05 | 2017-08-09 00:00:50.753  
     2 | 9.47 | 2017-08-09 00:01:00.797  
     3 | 8.80 | 2017-08-09 00:01:10.270 
     1 | 15.79 | 2017-08-09 00:01:19.073 
     1 | 28.51 | 2017-08-09 00:01:34.860 

结果表将有一个更多的列被称为group_counter和看起来像下面的表格。我搜索并找到了一些使用COUNT和PARTITION BY和GROUP BY的代码。但结果是不正确的,因为它不能保持一个接一个地发生重复的计数值。数据已按照我想要的方式排序。任何帮助将非常赞赏在这一点上。

state | duration | time     | group_counter 
    ------+----------+-------------------------+-------------- 
    1 | 28.29 | 2017-08-09 00:00:22.460 |  1 
    1 | 10.05 | 2017-08-09 00:00:50.753 |  1 
    2 | 9.47 | 2017-08-09 00:01:00.797 |  2 
    3 | 8.80 | 2017-08-09 00:01:10.270 |  3 
    1 | 15.79 | 2017-08-09 00:01:19.073 |  4 
    1 | 28.51 | 2017-08-09 00:01:34.860 |  4 

回答

1

您可以使用lag窗函数来表示排在那里的时间递增的顺序状态变化,然后用累计总和来生成组计数器。

select t.*, 
    sum(flag) over (order by time) as group_counter 
from (
    select t.*, 
     case when state = lag(state) over (order by time) 
      then 0 else 1 
     end as flag 
    from your_table t 
    ) t; 
+0

非常感谢你,不得不作出调整,但结果是我想要的。 –

+0

不客气。 – GurV