发现巨大事件流中的差距?

Mik*_*eC8 9 sql algorithm postgresql bigdata mongodb

我在PostgreSQL数据库中有大约100万个这种格式的事件:

id        |   stream_id     |  timestamp
----------+-----------------+-----------------
1         |   7             |  ....
2         |   8             |  ....
Run Code Online (Sandbox Code Playgroud)

大约有50,000个独特的流.

我需要找到所有事件,其中任何两个事件之间的时间超过特定时间段.换句话说,我需要找到在特定时间段内没有事件的事件对.

例如:

a b c d   e     f              g         h   i  j k
| | | |   |     |              |         |   |  | | 

                \____2 mins____/
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我想找到对(f,g),因为那些是紧邻间隙的事件.

我不在乎查询是否缓慢,即在100万条记录上如果需要一个小时左右就可以了.但是,数据集将继续增长,所以如果它的速度很慢,那么它可以保持稳定.

我也有MongoDB中的数据.

执行此查询的最佳方法是什么?

Pat*_*ick 4

您可以lag()通过按时间戳排序的stream_id 在分区上使用窗口函数来执行此操作。该lag()函数使您可以访问分区中以前的行;如果没有滞后值,则它是前一行。因此,如果stream_id 上的分区按时间排序,则前一行是该stream_id 的前一个事件。

SELECT stream_id, lag(id) OVER pair AS start_id, id AS end_id,
       ("timestamp" - lag("timestamp") OVER pair) AS diff
FROM my_table
WHERE diff > interval '2 minutes'
WINDOW pair AS (PARTITION BY stream_id ORDER BY "timestamp");
Run Code Online (Sandbox Code Playgroud)