根据自上次输入以来的时间,将一组日志条目分组为SQL中的访问

时间:2016-04-21 12:03:06

标签: sql postgresql sqlite group-by common-table-expression

我有一个日志条目表,其中包含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)。

1 个答案:

答案 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;