我正在浏览登录日志(在Netezza中),并试图查找在任何1小时时间段(任何连续的60分钟时间段,而不是严格按照一个小时的时间)内具有一定数量以上登录次数的用户12月1日。我查看了以下帖子,但大多数似乎都是针对特定时间范围内的搜索,而不是任何给定时间段。谢谢。 https://dba.stackexchange.com/questions/137660/counting-number-of-occurences-in-a-time-period https://dba.stackexchange.com/questions/67881/calculating-the-maximum-seen-so-far-for-each-point-in-time Count records per hour within a time span
答案 0 :(得分:1)
您可以使用分析功能lag
来按时间戳排序,以查看早19个条目的记录是否在一小时之内:
with cte as (
select user_id,
login_time,
lag(login_time, 19) over (partition by user_id order by login_time) as lag_time
from userlog
order by user_id,
login_time
)
select user_id,
min(login_time) as login_time
from cte
where extract(epoch from (login_time - lag_time)) < 3600
group by user_id
输出结果将显示匹配的用户在一个小时内记录第二十次时的首次出现。
答案 1 :(得分:0)
我想您可能会做类似的事情(为简单起见,我将使用登录表,将用户,日期时间作为单列):
with connections as (
select ua.user
, ua.datetime
from user_logons ua
where ua.datetime >= timestamp'2018-12-01 00:00:00'
)
select ua.user
, ua.datetime
, (select count(*)
from connections ut
where ut.user = ua.user
and ut.datetime between ua.datetime and (ua.datetime + 1 hour)
) as consecutive_logons
from connections ua
select count(*) ...
)的原因,整个查询并不是最快的,因为它是一个迭代的子查询-需要为每行重新评估。with
只是计算user_logons
的子集以最小化其成本。这可能没有用,但是会降低查询的复杂性。使用存储功能或语言驱动的功能(例如:java,php,...),可能会获得更好的性能。