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

Counting Rows but keeping duplicate values as the same count

使用 SQL 服务器 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

结果 table 将多一列,称为 group_counter,类似于下面的 table。我搜索并找到了一些使用 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

您可以利用lag window函数来表示状态变化按时间递增的行,然后使用累加和生成您的组计数器。

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;