计数行但保留重复值为相同的计数
问题描述:
使用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
答
您可以使用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;
非常感谢你,不得不作出调整,但结果是我想要的。 –
不客气。 – GurV