Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何获取一条记录与另一条记录首次出现的时差_Sql_Postgresql - Fatal编程技术网

Sql 如何获取一条记录与另一条记录首次出现的时差

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

我们有一个监控系统,以以下格式将数据发布到我们的postgres数据库:

我们的目标是计算
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';