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 中自动删除数据条目?