【问题标题】:SQL create time intervals where other column value is the sameSQL 创建其他列值相同的时间间隔
【发布时间】:2018-03-26 15:23:36
【问题描述】:

我有一个 SQL Server 表,它存储一个带有日期时间的事件,如下所示:

ES  TimeStamp
----------------------------
1   2018-03-05 00:00:12.000
1   2018-03-05 00:00:32.000
0   2018-03-05 00:00:52.000
0   2018-03-05 00:01:12.000
1   2018-03-05 00:01:32.000
1   2018-03-05 00:01:52.000
0   2018-03-05 00:02:12.000
0   2018-03-05 00:02:32.000
0   2018-03-05 00:02:52.000
0   2018-03-05 00:03:12.000
1   2018-03-05 00:03:32.000
1   2018-03-05 00:03:52.000
1   2018-03-05 00:04:12.000

我正在寻找一种从我的表中快速选择的方法:

ES   StartTimeStamp             EndTimeStamp
-------------------------------------------------------
1    2018-03-05 00:00:12.000    2018-03-05 00:00:32.000
0    2018-03-05 00:00:52.000    2018-03-05 00:01:12.000
1    2018-03-05 00:01:32.000    2018-03-05 00:01:52.000
0    2018-03-05 00:02:12.000    2018-03-05 00:03:12.000
1    2018-03-05 00:03:32.000    2018-03-05 00:04:12.000

【问题讨论】:

  • 您也可以发布您的尝试吗?
  • 03:52 的 ES=1 在哪里适合?

标签: sql sql-server tsql sql-server-2014


【解决方案1】:

您可以使用间隙和孤岛解决方案。

SELECT ES, MIN([TimeStamp]) StartTimeStamp, MAX([TimeStamp]) EndTimeStamp FROM 
    (SELECT *, 
        GRP = ROW_NUMBER() OVER(ORDER BY [TimeStamp]) - 
            ROW_NUMBER() OVER(PARTITION BY ES ORDER BY [TimeStamp])  FROM @MyTable) AS T
GROUP BY ES, GRP

样本数据:

DECLARE @MyTable TABLE (ES INT ,[TimeStamp] DATETIME)
INSERT INTO @MyTable VALUES
(1, '2018-03-05 00:00:12.000'),
(1, '2018-03-05 00:00:32.000'),
(0, '2018-03-05 00:00:52.000'),
(0, '2018-03-05 00:01:12.000'),
(1, '2018-03-05 00:01:32.000'),
(1, '2018-03-05 00:01:52.000'),
(0, '2018-03-05 00:02:12.000'),
(0, '2018-03-05 00:02:32.000'),
(0, '2018-03-05 00:02:52.000'),
(0, '2018-03-05 00:03:12.000'),
(1, '2018-03-05 00:03:32.000'),
(1, '2018-03-05 00:03:52.000'),
(1, '2018-03-05 00:04:12.000')

结果:

ES          StartTimeStamp          EndTimeStamp
----------- ----------------------- -----------------------
1           2018-03-05 00:00:12.000 2018-03-05 00:00:32.000
0           2018-03-05 00:00:52.000 2018-03-05 00:01:12.000
1           2018-03-05 00:01:32.000 2018-03-05 00:01:52.000
0           2018-03-05 00:02:12.000 2018-03-05 00:03:12.000
1           2018-03-05 00:03:32.000 2018-03-05 00:04:12.000

【讨论】:

  • 谢谢!这是我一直在寻找的。​​span>
【解决方案2】:

您可以使用LAG 进行分组,然后通过子查询分组将得到期望。

SELECT  t.ES ,
        MIN(t.TimeStamp) AS 'StartTimeStamp' ,
        MAX(t.TimeStamp) AS 'EndTimeStamp'
FROM    ( SELECT    * ,
                    MAX(flag) OVER ( ORDER BY t.TimeStamp ) rn
          FROM      ( SELECT    * ,
                                CASE WHEN t.ES = LAG(t.ES) OVER ( ORDER BY TimeStamp )
                                     THEN 0
                                     ELSE t.id
                                END flag
                      FROM      ( SELECT    * ,
                                            ROW_NUMBER() OVER ( ORDER BY TimeStamp ) AS id
                                  FROM      T
                                ) AS t
                    ) AS t
        ) AS t
GROUP BY t.es ,
        t.rn

SQLFiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2021-06-30
    • 1970-01-01
    相关资源
    最近更新 更多