【问题标题】:PostgreSQL find entries where timestamp differences are within range?PostgreSQL找到时间戳差异在范围内的条目?
【发布时间】:2017-11-05 02:48:22
【问题描述】:

我有一个包含 session_id、user_id、start_time 和 value 的表

从技术上讲,用户应该每 30 分钟获得一个新的 session_id,因此绝不应该出现 2 个条目具有相同的 user_id 但它们的开始时间彼此相差 30 分钟之内的情况。

如何运行查询来查找这些错误情况?
我做了这样的事情来查看给定用户的条目的一些时间差异:

select t1.start_time - t2.start_time
from user_sessions as t1 inner join
     user_sesssions as t2
     on t1.user_id = 1 and t2.user_id = 1

我知道我正在寻找以下情况:

((t1.start_time-t2.start_time) < 60*30*1000000 and (t1.start_time-t2.start_time) > 0) and t1.user_id = t2.user_id

我只是不确定如何将这两个部分放在一个查询中。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    这是你想要的吗?

    select t1.start_time - t2.start_time
    from user_sessions t1 inner join
         user_sesssions t2
         on t1.user_id = t2.user_id
    where (t1.start_time - t2.start_time) < 60*30*1000000 and 
          (t1.start_time - t2.start_time) > 0;
    

    【讨论】:

      【解决方案2】:

      使用LAG() OVER() 可以简单地计算行之间的时间差:

      SELECT
             user_id, previous_start, start_time, minutes_diff
      FROM (
           SELECT
              user_id
            , LAG(start_time) OVER(PARTITION BY user_id ORDER BY start_time) previous_start
            , EXTRACT(MINUTES FROM
                      start_time - lag(start_time) over(partition by user_id order by start_time)
                     ) minutes_diff
           FROM user_sessions
           ) d
      WHERE minutes_diff < 30
      ;
      

      【讨论】:

      • 您的问题现在解决了吗?你对这个答案还有疑问吗?要接受答案“Click the Tick”了解更多信息,请参阅help/accepting
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      相关资源
      最近更新 更多