Sql server 在时间轴SQL Server中对事件进行分组

Sql server 在时间轴SQL Server中对事件进行分组,sql-server,tsql,Sql Server,Tsql,我有一系列事件按照时间顺序依次发生。为了方便起见,我把比赛时间缩短到1分钟。有时,同一事件发生在同一事件之后,本质上使其成为同一事件 基本数据如下所示: 我想要一个如下所示的结果集: 实现这一点的最佳方法是什么?一种方法是使用行号的差异对活动岛进行分组。例如: SELECT Start = MIN(StartTime), [End] = MAX(EndTime), Activity FROM ( SELECT *, RN = ROW_NUMBER() OVER (ORDER BY S

我有一系列事件按照时间顺序依次发生。为了方便起见,我把比赛时间缩短到1分钟。有时,同一事件发生在同一事件之后,本质上使其成为同一事件

基本数据如下所示:

我想要一个如下所示的结果集:


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

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

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;

我希望这是最好的方式:

SELECT  X.Start, Y.[End], X.Activity
FROM
(
    SELECT ROW_NUMBER() OVER (ORDER BY E1.StartTime) RN, E1.StartTime [Start], E1.Activity
    FROM (
        SELECT *, ROW_NUMBER() OVER (ORDER BY StartTime) RN
        FROM #Events
    ) AS E1
    LEFT JOIN
    (
        SELECT *, ROW_NUMBER() OVER (ORDER BY StartTime) RN
        FROM #Events
    ) AS E2
    ON E1.Activity=E2.Activity
    AND E1.RN=E2.RN+1
    WHERE E2.Activity IS NULL
) X
INNER JOIN
(
    SELECT ROW_NUMBER() OVER (ORDER BY E1.StartTime) RN, E1.EndTime [End], E1.Activity
    FROM (
        SELECT *, ROW_NUMBER() OVER (ORDER BY StartTime) RN
        FROM #Events
    ) AS E1
    LEFT JOIN
    (
        SELECT *, ROW_NUMBER() OVER (ORDER BY StartTime) RN
        FROM #Events
    ) AS E2
    ON E1.Activity=E2.Activity
    AND E1.RN=E2.RN-1
    WHERE E2.Activity IS NULL
) Y
ON X.RN=Y.RN
结果:

2017-09-19 10:01:00.000 2017-09-19 10:15:00.000 Play
2017-09-19 10:16:00.000 2017-09-19 11:12:00.000 Subject 1
2017-09-19 11:13:00.000 2017-09-19 11:25:00.000 Play
2017-09-19 11:26:00.000 2017-09-19 12:35:00.000 Subject 2
2017-09-19 12:36:00.000 2017-09-19 12:45:00.000 Play

真是聪明的解决方案!谢谢
2017-09-19 10:01:00.000 2017-09-19 10:15:00.000 Play
2017-09-19 10:16:00.000 2017-09-19 11:12:00.000 Subject 1
2017-09-19 11:13:00.000 2017-09-19 11:25:00.000 Play
2017-09-19 11:26:00.000 2017-09-19 12:35:00.000 Subject 2
2017-09-19 12:36:00.000 2017-09-19 12:45:00.000 Play