我有一张记录状态和时间戳的表,就像这样:
id | 序列号 | 状态 | 时间戳 |
---|---|---|---|
1 | 100100100 | 正确 | 01:02:02 |
2 | 100100100 | 正确 | 01:02:14 |
3 | 100100100 | 错误 | 01:02:15 |
4 | 100100100 | 正确 | 01:02:26 |
5 | 100100100 | 正确 | 01:02:46 |
我需要获取每个状态所花费的时间,而每个状态的结束时间是下一条记录的时间戳值;像这样:
id | 序列号 | 状态 | 时间戳 | 持续时间 |
---|---|---|---|---|
1 | 100100100 | 正确 | 01:02:02 | 12 |
2 | 100100100 | 正确 | 01:02:14 | 1 |
3 | 100100100 | 错误 | 01:02:15 | 11 |
4 | 100100100 | 正确 | 01:02:26 | 20 |
5 | 100100100 | 正确 | 01:02:46 | (进行中) |
预期结果是:
序列号 | 状态 | 持续时间 |
---|---|---|
100100100 | 正确 | 12+1+20=42 |
100100100 | 错误 | 11 |
我尝试使用 LAG() 和 LEAD() 窗口函数,但无法获得预期结果。 你能帮我吗?
提前非常感谢!
您可以使用窗口函数
lead()
:
select serialno
, state
, sum(lead(timestamp) over (partition by serialno order by timestamp) - timestamp) as duration
from DeviceState
group by serialno, state