Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL问题:任何给定小时内大于N的发生次数_Sql_Netezza - Fatal编程技术网

SQL问题:任何给定小时内大于N的发生次数

SQL问题:任何给定小时内大于N的发生次数,sql,netezza,Sql,Netezza,我正在查看Netezza中的登录日志,并试图找到在任何1小时或任何连续60分钟的时间段内登录次数超过一定数量的用户,而不是从12月1日起严格按时钟小时登录的用户。我看过以下文章,但大多数似乎都是在特定的时间范围内进行搜索,而不是在任何给定的时间段内。谢谢 我想您可能会这样做,为了简单起见,我将使用一个登录表,其中user、datetime为单列: with connections as ( select ua.user , ua.datetime from user_log

我正在查看Netezza中的登录日志,并试图找到在任何1小时或任何连续60分钟的时间段内登录次数超过一定数量的用户,而不是从12月1日起严格按时钟小时登录的用户。我看过以下文章,但大多数似乎都是在特定的时间范围内进行搜索,而不是在任何给定的时间段内。谢谢
我想您可能会这样做,为了简单起见,我将使用一个登录表,其中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。这就是让我绊倒的原因。如果是一个时钟小时,我可以直接截断日期时间数据,但我真的一直在思考如何处理这个问题。这是一个非常有趣的问题。您能提供一组输入行和所需的输出行吗?