计算行但将重复值保留为相同计数
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;
使用 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;