PostgreSQL找到时间戳差异在范围内的条目?

Posted

技术标签:

【中文标题】PostgreSQL找到时间戳差异在范围内的条目?【英文标题】:PostgreSQL find entries where timestamp differences are within range? 【发布时间】: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

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

【问题讨论】:

【参考方案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

以上是关于PostgreSQL找到时间戳差异在范围内的条目?的主要内容,如果未能解决你的问题,请参考以下文章

是否有一种算法可以为给定范围内的每个条目找到最短的二进制表示?

删除 Postgresql 中的冗余时间戳范围

Django在数据库中找到最旧的条目

有没有办法设置“过期”时间,之后在 PostgreSQL 中自动删除数据条目?

提取时间戳在特定范围内的 Python Pandas 记录[关闭]

如何在postgreSQL中获得精确的日期差异?