计算行但将重复值保持为相同的计数

时间:2017-09-19 17:46:02

标签: sql sql-server sql-server-2016

使用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 个答案:

答案 0 :(得分: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;
相关问题