Sql 如何获取一条记录与另一条记录首次出现的时差
我们有一个监控系统,以以下格式将数据发布到我们的postgres数据库: 我们的目标是计算Sql 如何获取一条记录与另一条记录首次出现的时差,sql,postgresql,Sql,Postgresql,我们有一个监控系统,以以下格式将数据发布到我们的postgres数据库: 我们的目标是计算wa事件触发事件和wa事件恢复事件之间的时间,如果我有这样的数据,我下面的查询工作正常 ts | text -----------------------------+------------------+ 2021-04-15T18:35:08.000000Z | wa-event-triggered 2021-04-15T18:45:08.000
wa事件触发
事件和wa事件恢复
事件之间的时间,如果我有这样的数据,我下面的查询工作正常
ts | text
-----------------------------+------------------+
2021-04-15T18:35:08.000000Z | wa-event-triggered
2021-04-15T18:45:08.000000Z | wa-event-recovered
2021-04-15T18:50:08.000000Z | wa-event-triggered
2021-04-15T18:55:08.000000Z | wa-event-recovered
这张桌子太棒了
ts | text | Increase
-----------------------------+--------------------+-----------------+
2021-04-15T18:45:08.000000Z | wa-event-recovered | 00:10:00
2021-04-15T18:55:08.000000Z | wa-event-recovered | 00:05:00
然而,数据并非总是连续的,因为我们的警报系统可以在我们最终恢复wa事件之前发布多个wa事件触发的
事件,因此,如果有数百对触发/恢复的wa事件,我如何获得第一个触发的wa事件与第一个恢复的wa事件之间的时差,并忽略其间所有触发的wa事件
ts | text
-----------------------------+------------------+
2021-04-15T18:35:08.000000Z | wa-event-triggered <- start timer
2021-04-15T18:45:08.000000Z | wa-event-triggered
2021-04-15T18:55:08.000000Z | wa-event-triggered
2021-04-15T18:50:08.000000Z | wa-event-recovered <- end timer
2021-04-15T19:00:00.000000Z | wa-event-triggered <- start timer
2021-04-15T19:05:08.000000Z | wa-event-triggered
2021-04-15T19:10:08.000000Z | wa-event-triggered
2021-04-15T19:15:08.000000Z | wa-event-recovered <- end timer
2021-04-15T20:05:08.000000Z | wa-event-triggered <- start timer
2021-04-15T20:10:08.000000Z | wa-event-triggered
2021-04-15T20:15:08.000000Z | wa-event-recovered <- end timer
ts|文本
-----------------------------+------------------+
2021-04-15T18:35:08.000000Z|wa事件触发您可以只包括更改的记录并使用您的方法:
select *
from (select text, ts,
ts::timestamp - lag(ts::timestamp) over (order by ts::timestamp) as increase
from (select m.*,
lag(text) over (order by ts::timestamp) as prev_text
from messages m
where text ~ 'wa-event-' or alerts.text ~ 'recovered'
) m
where text ~ 'wa-event-' and
prev_text is distinct from text
) alerts
where alerts.text ~ 'recovered';
哇,你是个忍者!!在一次小的编辑中,我得到了一个语法错误,只需要删除警报.text
并使其成为text
select *
from (select text, ts,
ts::timestamp - lag(ts::timestamp) over (order by ts::timestamp) as increase
from (select m.*,
lag(text) over (order by ts::timestamp) as prev_text
from messages m
where text ~ 'wa-event-' or alerts.text ~ 'recovered'
) m
where text ~ 'wa-event-' and
prev_text is distinct from text
) alerts
where alerts.text ~ 'recovered';