gpt4 book ai didi

sql - 在巨大的事件流中寻找差距?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:30:11 25 4
gpt4 key购买 nike

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

id        |   stream_id     |  timestamp
----------+-----------------+-----------------
1 | 7 | ....
2 | 8 | ....

大约有 50,000 个唯一流。

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

例如:

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

\____2 mins____/

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

我不在乎查询是否(那么)慢,即在 100 万条记录上,如果需要一个小时左右就可以了。然而,数据集将继续增长,所以希望它能在缓慢的情况下正常扩展。

我在 MongoDB 中也有数据。

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

最佳答案

您可以使用 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");

关于sql - 在巨大的事件流中寻找差距?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30610669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com