Postgres在序列中搜索事件之前和之后检索事件

时间:2017-10-25 00:58:10

标签: postgresql

我有一个充满事件序列的表,其中每个事件序列都有许多具有时间戳ts,文本字段event_text和唯一ID event_id的唯一事件。我正在查询该表,查找具有与搜索条件匹配的event_text的所有事件序列,即以下情况中的test%

我正在尝试首先找到发生该文本的每个事件,然后在上下文中找到由ts直接跟在ts所选事件前面的事件。正如您在下面的示例代码中所看到的,我能够直接得到事件而没有太多问题,但是如何在使用相同查询之前获得事件,选定事件和事件?

SELECT a.event_sequence_id, 
a.event_id, 
(ARRAY_AGG(ROW_TO_JSON((
SELECT t FROM (SELECT p.*) t)
) ORDER BY ts ASC))[1:2] AS event_sequence
FROM event_sequence_table a JOIN LATERAL (
    SELECT event_sequence_id,
    ts,
    event_text,
    event_id,
    FROM event_sequence_table
    WHERE event_sequence_id = a.event_sequence_id
    AND ts >= a.ts
) p ON TRUE
WHERE event_text ILIKE 'test%'
GROUP BY a.event_sequence_id, a.event_id

1 个答案:

答案 0 :(得分:1)

使用window functions lag()lead()。例如:

select 
    to_json(lag) as previous, 
    to_json(a) as found, 
    to_json(lead) as next
from (
    select
        event_text,
        lag(a) over w,
        a,
        lead(a) over w
    from event_sequence_table a
    window w as (partition by event_sequence_id order by ts)
    ) s
where event_text ilike 'test%';