间隙和岛屿:获取在州内度过的时间

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

我有一张记录状态和时间戳的表,就像这样:

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() 窗口函数,但无法获得预期结果。 你能帮我吗?

提前非常感谢!

postgresql gaps-and-islands
1个回答
0
投票

您可以使用窗口函数

lead()

select serialno
  , state 
  , sum(lead(timestamp) over (partition by serialno order by timestamp) - timestamp)  as duration
from DeviceState
group by serialno, state
© www.soinside.com 2019 - 2024. All rights reserved.