【问题标题】:Getting only most recent timestamp from a set of distinct values, so there are no repeats of 'distinct' values and only one timestamp仅从一组不同的值中获取最近的时间戳,因此没有重复的“不同”值,只有一个时间戳
【发布时间】:2022-07-05 23:19:54
【问题描述】:

我们正在处理来自恶意软件实验室感染的数据库存储的、经过 Bro 处理的网络事件,以便用数据填充 MISP 实例。底层数据库系统是PostgreSQL。

我们有更新 MISP 端的代码工作正常,但由于存在 具有不同时间戳的重复事件,我们可以为不同的 ip 和端口对获得数千个数据结果。

值的示例类似于(注意:数据类型包含在表中的标题行中,以便清楚地了解其在 SQL DB 中的存储方式):

ts (timestamp w/ timezone) resp_h (inet) resp_p (integer)
2022-07-05 07:37:50.869766 +00:00 52.254.114.69 443
2022-07-05 06:29:37.149036 +00:00 64.62.200.237 443
2022-07-05 06:29:24.205741 +00:00 64.62.200.237 443
...

我们可以从我们的表格中选择如下数据,这些数据是“不同的”(注意INFECTIONID 是一个整数值,表示系统中的特定感染 ID):

SELECT DISTINCT ts, resp_h, resp_p 
FROM bro_data WHERE infection=INFECTIONID 
  AND resp_h IS NOT NULL 
  AND resp_p IS NOT NULL
ORDER BY ts DESC

现在,我几乎可以肯定我们可以进一步缩小范围,但我不完全确定如何去做。我想做的是缩小数据列表的范围,以便我们为每个只有一个时间戳的 resp_hresp_p 值获得 一个 记录 - 记录的最新时间戳。

使用上面数千个示例值,所需的结果将是恰好返回两个值(再次,数据值类型以及与上表保持一致的标头):

ts (timestamp w/ timezone) resp_h (inet) resp_p (integer)
2022-07-05 07:37:50.869766 +00:00 52.254.114.69 443
2022-07-05 06:29:37.149036 +00:00 64.62.200.237 443

我的 SQL 经验不如 Python 经验丰富,我希望 必须在 Python 代码中预处理数以千计的数据值,以便将数据处理为 MISP 事件在我们这边。有没有人可以帮助指导我使用正确的 SQL 搜索语法来获得所需的结果?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    未经测试:

    SELECT 
       *
    FROM 
       (SELECT DISTINCT ON (resp_h, resp_p) ts, resp_h, resp_p
        FROM bro_data WHERE infection=INFECTIONID 
        AND resp_h IS NOT NULL 
        AND resp_p IS NOT NULL)
      AS
         dist
    ORDER BY 
       ts DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 2021-12-14
      • 1970-01-01
      • 2018-05-04
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多