我有一个日志条目表,其中包含id,timestamp,source_ip(用于IP地址)和其他一些数据。我想将此分组为&#34;访问&#34;,其中访问是来自一个IP地址的所有日志条目,其中有&lt;自上次日志条目以来X秒。即,对于访问中的每个日志条目,在该访问中必须至少有一个其timstamp <1的其他条目。在此之前或之后X秒。
如果X = 10分钟,IP A有以下要求:12:00,12:05,12:11,12:40,12:42,12:50,12:52,14:01,那么有3个访问团:[12:00,12:05,12:11],[12:40,12:42,12:50,12:52],[14:01]。
我想在SQL中完全这样做,但我不确定如何。我猜它是一种分组形式,也许是使用Common Table Expressions(WITH子句)?谁能告诉我如何生成这个?我知道如何在Python中使用它(比如说),但是我想在SQL中完成它
我目前正在尝试使用SQLite 3,但我愿意更改为PostgreSQL(甚至更改为postgresql 9.5)。
答案 0 :(得分:1)
你可以在Postgres中做到这一点。我不推荐SQLite,因为它不支持窗口/分析函数。
您可以使用lag()
和某些日期算术找到小组的开始位置。然后,您可以对此信息进行累积求和以识别每个组:
select l.*,
sum(case when prev_ts + interval '10 minute' > timestamp then 0
else 1
end) over (partition by ip order by timestamp) as groupid
from (select l.*,
lag(timestamp) over (partition by ip order by timestamp) as prev_ts
from logs l
) l;