【问题标题】:Grouping a set of log entries into visits, in SQL, based on time since last entry在 SQL 中,根据自上次条目以来的时间将一组日志条目分组为访问
【发布时间】:2016-04-21 12:03:06
【问题描述】:

我有一个日志条目表,其中包含 id、时间戳、source_ip(用于 IP 地址)和一些其他数据。我想将其分组为“访问”,其中访问是来自一个 IP 地址的所有日志条目,自上次日志条目以来

如果 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 中执行此操作,但我不确定如何操作。我猜它是一种分组形式,也许是公用表表达式(WITH 子句)?谁能告诉我如何生成这个?我知道如何在 Python 中完成它(比如说),但我想用 SQL 完成它

我目前正在尝试使用 SQLite 3,但我愿意更改为 PostgreSQL(甚至更改为 postgresql 9.5)。

【问题讨论】:

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


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      相关资源
      最近更新 更多