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