sql-server - 在时间线 SQL Server 中对事件进行分组

标签 sql-server t-sql

我有一系列按时间顺序依次发生的事件。为了方便起见,我将事件四舍五入到 1 分钟。有时,同一事件发生在同一事件之后,本质上使其成为同一事件。

基础数据如下所示:

enter image description here

    create table #Events (StartTime datetime,EndTime datetime,Activity varchar(55)) insert into #Events (Start,End,Activity) select '2017/09/19 10:01','2017/09/19 10:15','Play' insert into #Events (Start,End,Activity) select '2017/09/19 10:16','2017/09/19 11:00','Subject 1' insert into #Events (Start,End,Activity) select '2017/09/19 11:01','2017/09/19 11:12','Subject 1' insert into #Events (Start,End,Activity) select '2017/09/19 11:13','2017/09/19 11:15','Play' insert into #Events (Start,End,Activity) select '2017/09/19 11:16','2017/09/19 11:25','Play' insert into #Events (Start,End,Activity) select '2017/09/19 11:26','2017/09/19 12:14','Subject 2' insert into #Events (Start,End,Activity) select '2017/09/19 12:15','2017/09/19 12:25','Subject 2' insert into #Events (Start,End,Activity) select '2017/09/19 12:26','2017/09/19 12:35','Subject 2' insert into #Events (Start,End,Activity) select '2017/09/19 12:36','2017/09/19 12:45','Play' 

我想要一个如下所示的结果集: enter image description here

实现这一目标的最佳方法是什么?

最佳答案

一种方法是使用行号的差异来对事件岛进行分组。例如:

SELECT Start = MIN(StartTime), [End] = MAX(EndTime), Activity
FROM (
    SELECT *, RN = ROW_NUMBER() OVER (ORDER BY StartTime) - ROW_NUMBER() OVER (PARTITION BY Activity ORDER BY StartTime)
    FROM #Events
) AS E
GROUP BY Activity, RN;

关于sql-server - 在时间线 SQL Server 中对事件进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46310835/

相关文章:

sql - 如何记录SQL Server代理作业的成功和失败

sql - 插入时将数字转换为数据类型数字的算术溢出错误

sql-server - 在 Windows 7 上,我的 VB6 应用程序看不到 'System' DSN,但可以轻松找到 'User' DSN

sql-server-2008 - T-SQL 查看子查询Where 子句

sql - 将 .bacpac 从一个 Azure SQL Server 还原到另一个 Azure SQL Server 后,包含的用户密码和登录用户密码不起作用

sql-server - 如何在 SQL 中检查特定登录名下是否存在某个用户?

sql - 将列内包含 JSON 数组的行扩展到多行

sql-server - 如何在检查约束中引用其他表?

mysql - OR 不在 MSSQL 中查询

c# - 具有相同表的多个模式的 EF6 中的 Multi-Tenancy