SQL问题:任何给定小时内大于N的发生次数
我正在查看Netezza中的登录日志,并试图找到在任何1小时或任何连续60分钟的时间段内登录次数超过一定数量的用户,而不是从12月1日起严格按时钟小时登录的用户。我看过以下文章,但大多数似乎都是在特定的时间范围内进行搜索,而不是在任何给定的时间段内。谢谢SQL问题:任何给定小时内大于N的发生次数,sql,netezza,Sql,Netezza,我正在查看Netezza中的登录日志,并试图找到在任何1小时或任何连续60分钟的时间段内登录次数超过一定数量的用户,而不是从12月1日起严格按时钟小时登录的用户。我看过以下文章,但大多数似乎都是在特定的时间范围内进行搜索,而不是在任何给定的时间段内。谢谢 我想您可能会这样做,为了简单起见,我将使用一个登录表,其中user、datetime为单列: with connections as ( select ua.user , ua.datetime from user_log
我想您可能会这样做,为了简单起见,我将使用一个登录表,其中user、datetime为单列:
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
这取决于您的用户datetime列
这取决于你找到dateadd设施ua.datetime+1小时不起作用;这或多或少取决于数据库实现,例如,它是mySQL中的DATE_ADD
由于子查询select count*…,整个查询将不是最快的,因为它是一个相关子查询-需要为每一行重新计算它。
with只需计算用户登录的子集,以最小化其成本。这可能没有用处,但是这将降低查询的复杂性。
使用存储函数或语言驱动(例如java、php等)可能会有更好的性能。。。函数。您可以使用分析函数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
当用户在一小时内记录了第二十次时,输出将显示第一次出现的匹配用户。什么构成给定的一小时?示例:任何连续60分钟的时间段?即12:23-1:23。。或者只是12:00-1:00和1:00-2:00..前12:23-1:23。这就是让我绊倒的原因。如果是一个时钟小时,我可以直接截断日期时间数据,但我真的一直在思考如何处理这个问题。这是一个非常有趣的问题。您能提供一组输入行和所需的输出行吗?