我使用AWS中的Athena和Windows事件管理器日志来构造一些安全事件查询。其中之一是,我想在5分钟内查询报告3次或3次以上失败登录尝试的机器。
时间戳列的格式如下:2019-03-25T19:18:10.7954381Z
我已经用特定的事件id:SELECT machinename,          COUNT(eventid) FROM windows WHERE eventid = 4625 GROUP BY  machinename HAVING COUNT(eventid = 4625) >= 3;完成了查找机器。
它只是为任何时间戳返回所有事件It大于或等于3的机器。
我的问题是:如何在SQL中实现逻辑,以检查该特定事件I是否在5分钟的时间范围内发生,而不是只显示所有时间?
这是我对SQL的第一次尝试;任何帮助都是非常感谢的。谢谢!
编辑:西奥有解决方案。在此张贴:
SELECT   FROM_UNIXTIME(     FLOOR(       TO_UNIXTIME(         DATE_PARSE(substr(timecreated, 1, 16), '%Y-%m-%dT%H:%i')       )/300     ) * 300   ) AS five_minute_window,   machine-name,   COUNT(event-id) AS event_count FROM table WHERE event-id = 4625 GROUP BY 1, machine-name HAVING COUNT(event-id = 4625) >= 3;
我不得不刮掉小数秒,因为有一些不正常的时间戳没有格式化(只有整秒钟)。
发布于 2019-04-11 18:26:27
在雅典娜中,您可以使用DATE_TRUNC函数将时间戳截断为整分钟、小时等。不幸的是,它不支持单位的倍数,因此五分钟是不可能的。
我通常是这样做的:FROM_UNIXTIME(FLOOR(TO_UNIXTIME("timestamp")/300) * 300)。它把它转换成UNIX时间戳,即自1970年以来的秒数,除以300,得到自1970年以来每隔5分钟的时间,然后将其舍入整数,然后再乘以300,将其转换为秒,然后再将其转换为时间戳。这适用于任何间隔,只需改变300到1800轮到半个小时,等等。
雅典娜不支持时间戳格式,所以您需要解析它,这是用DATE_PARSE完成的,例如DATE_PARSE("timestamp_column", '%Y-%m-%dT%H:%M:%S.%fZ')。
完整的示例可能如下所示:
SELECT
  FROM_UNIXTIME(
    FLOOR(
      TO_UNIXTIME(
        DATE_PARSE("timestamp_column", '%Y-%m-%dT%H:%M:%S.%fZ')
      )/300
    ) * 300
  ) AS five_minute_window,
  COUNT(*) AS event_count
FROM some_table
GROUP BY 1这将给出每5分钟窗口中的行数。您可以添加一个WHERE来筛选特定行,并添加外部查询来查找具有许多事件的窗口,等等。
发布于 2019-04-10 15:51:46
所以你想在n分钟内转一圈,对吧?我把oracle语法放在下面,但请注意,所有数据库都有类似的功能。方法是在这一分钟“舍入”或“截断”数据。现在是10点43分-10点40分。一旦你得到它,你就可以按它来分组了。
select actual_date,
       to_date(to_char(actual_date,'YYYYMMDDHH24') || min_trunc_5,'YYYYMMDDHH24MI') rouded_to_5_dt,
       min_trunc_5
from
(
    select sysdate  actual_date, 
           ltrim(to_char(trunc(to_number(to_char(sysdate,'MI')/5))*5,'09')) min_trunc_5
    from dual
) x它回来找我了
actual_date      rounded_to_5_dt min_trunc_5
20190410084837   20190410084500  45看看48岁到45岁。现在,如果对任何日期和组进行这种类型的操作,我将对5分钟范围内的所有数据进行分组。
https://stackoverflow.com/questions/55615611
复制相似问题