如何在SQL Server

时间:2017-12-11 11:19:21

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

我遇到了一个有趣的问题,我试图将能源使用日志与生产环境中的特定事件联系起来。我们的生产数据已记录约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

一旦我有了开始和结束时间戳,我就能够为工厂的每种模式提取能源使用数据,例如,空闲,预热,ready_standby,生产等,并形成每种模式的平均使用量,但我已经陷入了每一步,我已经看过分区,阅读有关岛屿和空白的文章,但我找不到以这种方式记录数据的示例。任何建议都很棒

1 个答案:

答案 0 :(得分: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。如果你有这个,你可以轻松地将它们分组。