SQL - 基于Interval数据创建项集

时间:2017-12-16 09:34:10

标签: sql-server intervals

我读过一篇很有价值的文章,解释了如何计算此链接上每个离散时间的行数: 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只是EndTimeStartTime的减法。

p.s:我正在使用SQLServer 2014。

1 个答案:

答案 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

仍然欢迎任何新的想法或更好的方法。