我读过一篇很有价值的文章,解释了如何计算此链接上每个离散时间的行数: Intervals and Counts - part1
理念是首先为每个事件创建表示其开始和结束时间的序列,然后打包这些间隔,同时计算每个应用程序的行数。
我遇到的问题有点不同。我有相同的数据做同样的过程,并达到这样的表:
StartTime EndTime App
1 5 A
8 9 A
3 9 B
1 9 C
我渴望的输出是共同应用的项目集。在时间图上放置这些间隔可以帮助您理解我想要的内容。
这是我正在寻找的输出:
StartTime EndTime AppsOpen TimeSpan
1 3 A,C 2
3 5 A,B,C 2
5 8 B,C 3
8 9 A,B,C 1
注意:列TimeSpan
只是EndTime
和StartTime
的减法。
p.s:我正在使用SQLServer 2014。
答案 0 :(得分:0)
经过一番思考后,我决定找出如何提取最终间隔(即:[1:3],[3:5],[5:8],[8:9])。
之后,我只能选择包含间隔或包含间隔的行。
最终查询如下所示:
注意:为简洁起见,我映射了列和表名,如下所示:
“Ts”表示“StartTime”,
“Te”表示“EndTime”,
“E”是如上所述的主表。
with p as (select distinct ts from E union select distinct te from E)
, q as (select ts, lead(ts) over (order by ts) as te from p)
, X as (select q.Ts, q.Te, app from E inner join q on
(E.Ts >= q.Ts and E.Ts < q.Te) -- started in the interval
or
(E.Ts <= q.Ts and E.Te > q.Ts)-- started before the interval but present during interval
)
select Ts,Te, STUFF((SELECT ', ' + CAST(App AS VARCHAR(MAX))
FROM X y WHERE (y.Ts = x.Ts and y.Te = x.Te)
FOR XML PATH(''),TYPE
).value('.','VARCHAR(MAX)') ,1,2,'') from X x group by Ts,Te
仍然欢迎任何新的想法或更好的方法。