【问题标题】:SQL Server 2012 - Calculate time in state based on state changeSQL Server 2012 - 根据状态变化计算状态时间
【发布时间】:2020-09-19 23:26:07
【问题描述】:

我正在尝试计算机器处于特定状态的时间,然后按小时求和。该状态仅在更改时记录,因此我们可以假设它在更改之前处于相同状态。

我试图使用分区,但我认为这不是正确的方法。

我的表结构有序描述:

+----------+-------------------------+
| state_id |         t_stamp         |
+----------+-------------------------+
|        0 | 2020-06-01 10:44:06.663 |
|        2 | 2020-06-01 10:43:56.660 |
|        0 | 2020-06-01 10:43:06.653 |
|        2 | 2020-06-01 10:42:56.653 |
|        0 | 2020-06-01 10:41:36.643 |
|        3 | 2020-06-01 10:41:26.640 |
|        0 | 2020-06-01 10:41:16.640 |
|        2 | 2020-06-01 10:40:56.637 |
|        0 | 2020-06-01 10:40:06.630 |
|        3 | 2020-06-01 10:39:56.630 |
+----------+-------------------------+

我想要达到的目的:

+----------+------------------+
| state_id | duration_seconds |
+----------+------------------+
|        2 |               10 |
|        0 |               50 |
+----------+------------------+

【问题讨论】:

    标签: sql-server tsql date window-functions gaps-and-islands


    【解决方案1】:

    你可以使用窗口函数,然后聚合:

    select 
        state_id, 
        sum(datediff(second, t_stamp, lead_t_stamp)) duration_second
    from  ( 
        select
            t.*,
            lead(t_stamp) over(order by t_stamp) lead_t_stamp
        from mytable t
    ) t
    where lead_t_stamp is not null
    group by state_id
    order by state_id
    

    这个 demo on DB Fiddle 与您的 uample 数据返回:

    state_id |持续时间_秒 --------: | --------------: 0 | 190 2 | 40 3 | 20

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      • 2020-12-22
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      相关资源
      最近更新 更多