SQL 服务器:按开始和结束事件对条目进行分组
SQL Server : group entries by start and end event
不幸的是,我对 SQL 服务器没有太多经验。
我有一个具有以下结构和示例数据的 table:
ID
Status
TimeStamp
68
2
10.01.2022 08:45:02
52
0
10.01.2022 08:44:29
50
0
10.01.2022 08:41:12
46
0
10.01.2022 08:41:02
40
1
10.01.2022 08:40:07
38
2
10.01.2022 08:20:05
32
0
10.01.2022 08:19:29
30
1
10.01.2022 08:15:34
我现在要做的就是状态1的时间戳为开始,状态2的时间戳为结束,统计中间为0的条目。不幸的是,这些条目不是连续的。所以我不能只向前或向后数 ID。结果应如下所示:
Start
End
CountStatus0
10.01.2022 08:40:07
10.01.2022 08:45:02
3
10.01.2022 08:15:34
10.01.2022 08:20:05
1
如果您能提供有关如何最好地解决此问题的建议,我将不胜感激。
我已经尝试用 group by
函数解决它,但我还没有成功。
您已标记SQL Server 2008 - 我认为以下是兼容的,当然无法测试。
您可以使用横向连接(交叉应用)来找到应用于每一行的相应end时间戳。
然后简单地按结束时间戳聚合并计算状态为零的行。
with e as (
select t.timestamp tstart, e.timestamp tend
from t
cross apply (
select Min(timestamp) timestamp
from t t2
where t2.status=2
and t2.timestamp > t.timestamp
)e
where status=0
)
select Min(tstart) [Start], Max(tend) [end], count(*) CountStatus0
from e
group by tend
order by [start] desc
不幸的是,我对 SQL 服务器没有太多经验。
我有一个具有以下结构和示例数据的 table:
ID | Status | TimeStamp |
---|---|---|
68 | 2 | 10.01.2022 08:45:02 |
52 | 0 | 10.01.2022 08:44:29 |
50 | 0 | 10.01.2022 08:41:12 |
46 | 0 | 10.01.2022 08:41:02 |
40 | 1 | 10.01.2022 08:40:07 |
38 | 2 | 10.01.2022 08:20:05 |
32 | 0 | 10.01.2022 08:19:29 |
30 | 1 | 10.01.2022 08:15:34 |
我现在要做的就是状态1的时间戳为开始,状态2的时间戳为结束,统计中间为0的条目。不幸的是,这些条目不是连续的。所以我不能只向前或向后数 ID。结果应如下所示:
Start | End | CountStatus0 |
---|---|---|
10.01.2022 08:40:07 | 10.01.2022 08:45:02 | 3 |
10.01.2022 08:15:34 | 10.01.2022 08:20:05 | 1 |
如果您能提供有关如何最好地解决此问题的建议,我将不胜感激。
我已经尝试用 group by
函数解决它,但我还没有成功。
您已标记SQL Server 2008 - 我认为以下是兼容的,当然无法测试。
您可以使用横向连接(交叉应用)来找到应用于每一行的相应end时间戳。
然后简单地按结束时间戳聚合并计算状态为零的行。
with e as (
select t.timestamp tstart, e.timestamp tend
from t
cross apply (
select Min(timestamp) timestamp
from t t2
where t2.status=2
and t2.timestamp > t.timestamp
)e
where status=0
)
select Min(tstart) [Start], Max(tend) [end], count(*) CountStatus0
from e
group by tend
order by [start] desc