是否可以在T-SQL

时间:2017-10-06 13:27:51

标签: sql sql-server tsql gaps-and-islands

是否可以编写一个SQL查询,根据日期时间列值与相邻行的值之间的差异对行进行分组?

让我举个例子......我有一个类似这样的SQL查询:

SELECT
    Id,
    StartTime,
    EndTime,
    datediff(second, max(StartTime), EndTime)) as Duration
FROM Timings
ORDER BY StartTime

返回的结果如下:

| ID | StartTime           | EndTime             | Duration
| 1  | 2017-10-06 10:59:48 | 2017-10-06 10:59:58 | 10
| 2  | 2017-10-06 11:00:02 | 2017-10-06 11:00:06 | 4
| 3  | 2017-10-06 11:00:15 | 2017-10-06 11:00:22 | 7
| 4  | 2017-10-06 11:00:30 | 2017-10-06 11:00:39 | 9
| 5  | 2017-10-06 15:34:31 | 2017-10-06 15:34:45 | 14
| 6  | 2017-10-06 15:34:48 | 2017-10-06 15:34:56 | 8
| 7  | 2017-10-06 15:34:52 | 2017-10-06 15:34:59 | 7

重要的是,时间分两批,前四个都是在上午11点左右完成,后两个是在凌晨3点半左右完成。

我想详细了解每批时间的开始/结束时间,平均持续时间以及组中的时间数。为此,我需要的是一种按批次对时间进行分组的方法,其中批次被定义为在开始时间排序时,在一个结束和下一个开始之间少于30秒的时间组。有可能吗?

关于实际情况的一些相关说明......

  • 批次中唯一真正与众不同的特征是,一个定时的结束与下一个定时的开始之间的差距将明显更大。硬编码固定的时间限制就可以了。
  • 在此示例中,一天可能有多个批次,因此按日期分组。
  • 实际上,批次可以是几分钟到几个小时的长度,只包含几个时间,或几千个。批次没有固定的时间。
  • 记下第6行和第6行的时间安排。 7.多个时间确实发生并行重叠,一个结束与下一个结束之间的大差距的区别仍然作为识别批次的方式。

2 个答案:

答案 0 :(得分:3)

在SQL Server 2012+中:

使用common table expression中的窗口函数lag()获取当前行datediff()的{​​{1}}与starttime的上一行值相比较,以及然后endtime使用条件聚合(与硬编码值比较)生成sum() over()

batch

rextester演示:http://rextester.com/OVNF90739

返回:

;with cte as (
select *
  , datediff(second,lag(endtime) over (order by starttime),starttime) as prev_dat
from timings
)
select id, starttime, endtime, duration
  , sum(case when coalesce(prev_dat,31)>30 then 1 else 0 end) over (
    order by starttime
    ) as batch
from cte

答案 1 :(得分:0)

您可以按日期时间部分进行分组

module.export = {
    addFields: [
        {
            type:'string',
            name:'analytics',
            label: 'Google Analytics Property ID (like UA-XXXXX)'
        }
    ]
};

你还必须改变你选择匹配