我有一个充满事件序列的表,其中每个事件序列都有许多具有时间戳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
答案 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%';