如何获得时差持续时间基于名称,而值仅减小时?

问题描述 投票:0回答:1

我正在查找Value为1且现在为0的行之间的时间差总和,按名称分组。

单个名称的示例数据,但实际数据中有许多不同的名称。

+--------+---------------+---------------------+--------+
| RowNum |     Name      |      Timestamp      | Value  |
+--------+---------------+---------------------+--------+
|      1 | D1_HS_308_ALM | 2020-02-10 11:55:00 | 0      |
|      2 | D1_HS_308_ALM | 2020-02-10 11:51:00 | 0      |
|      3 | D1_HS_308_ALM | 2020-02-10 11:49:00 | NULL   |
|      4 | D1_HS_308_ALM | 2020-02-10 11:46:00 | 1      |
|      5 | D1_HS_308_ALM | 2020-02-10 08:02:00 | 0      |
|      6 | D1_HS_308_ALM | 2020-02-10 08:02:00 | NULL   |
|      7 | D1_HS_308_ALM | 2020-02-10 08:02:00 | 0      |
|      8 | D1_HS_308_ALM | 2020-02-10 07:56:00 | 1      |
+--------+---------------+---------------------+--------+

此数据在第8行-> 7过渡时应返回6分钟,而在第4行-> 2过渡时应返回5分钟;此名称总计11分钟。

当不确定下一行是否具有正确的值更改时,我不确定如何完成此操作-有时以后会多行或多行。

sql sql-server
1个回答
0
投票

如果您是指active,请使用lag()

select name,
       sum(datediff(second, prev_timestamp, timestamp)) as num_seconds
from (select t.*,
             lag(active) over (partition by name order by timestamp) as prev_active,
             lag(timestamp) over (partition by name order by timestamp) as prev_timestamp
     from t
     where active in (0, 1)
    ) t
where active = 1 and prev_active = 0
group by name;
© www.soinside.com 2019 - 2024. All rights reserved.