【问题标题】:How to find start and end times where a particular condition is continuously true in SQL Server如何在 SQL Server 中查找特定条件持续为真的开始和结束时间
【发布时间】:2017-12-11 19:50:03
【问题描述】:

我遇到了一个有趣的问题,我试图将能源使用日志与生产环境中的特定事件联系起来。我们的生产数据已经记录了大约 6 个月,记录的数据每 30 秒或在更改时插入一条记录。在这些日志中,“工厂模式”也使用以下结构记录:

t_stamp             tag     value
----------------------------------
11/12/17 21:00:00   mode    10
11/12/17 21:00:30   mode    10
11/12/17 21:01:00   mode    80
11/12/17 21:01:30   mode    80
11/12/17 21:02:00   mode    80
11/12/17 21:02:30   mode    80
….                  mode    80
12/12/17 03:03:30   mode    80
12/12/17 03:04:00   mode    80
12/12/17 03:04:30   mode    80
12/12/17 03:05:00   mode    10
12/12/17 03:05:30   mode    10
12/12/17 03:06:00   mode    10
12/12/17 03:06:30   mode    10

我希望查询返回如下结果:

row    mode    start_t_stamp        end_time_stamp
------------------------------------------------------
1      10      11/12/17 21:00:00    11/12/17 21:00:30
2      80      11/12/17 21:01:00    12/12/17 03:04:30
3      10      12/12/17 03:05:00    12/12/17 03:06:30

一旦我有了开始和结束时间戳,我就可以提取工厂每种模式的能源使用数据,例如空闲、预热、就绪待机、生产等,并形成每种模式的平均使用量,但是我被困在每一步,我查看了分区,阅读了有关岛屿和间隙的文章,但我找不到以这种方式记录数据的示例。任何建议都会很棒

【问题讨论】:

    标签: sql sql-server time grouping gaps-and-islands


    【解决方案1】:

    这是一个差距和孤岛问题。如果您有可用的窗口功能,那么您可以使用以下

    select value, 
           min(t_stamp) start_t_stamp , 
           max(t_stamp) end_time_stamp 
    from
    (
        select *, row_number() over (partition by value order by t_stamp) - 
                  row_number() over (order by t_stamp) grn
        from data
    ) t
    group by value, grn
    

    基本思想是具有相同value 的后续行将具有相同的grn。当你有这个时,你可以轻松地将它们分组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 2022-12-08
      • 1970-01-01
      • 2010-11-22
      • 2016-01-21
      相关资源
      最近更新 更多