我有一个可能微不足道的SQL问题.我的PostgreSQL数据库有两个表,即"Logging"和"DEBUG_DATA".前者用于记录从我的系统提供的事件.这些事件可以是错误、警告或只是一些系统信息."DEBUG_DATA"包含更详细的信息,更新频率更高,可用于确定错误或警告的根本原因.每个表都包含一个带有时间戳的列,该时间戳由PostgreSQL数据库提供,用于保持时间一致性. 我想要做的是从"Logging"中 Select 最近5个错误事件的时间戳.然后从"DEBUG_DATA"获取该时间戳前后+/-2分钟间隔内的调试数据.

正确的SQL查询应该是什么样子的?到目前为止,我得到了这样的结论:

select * from debug_data in
(select timestamp from logging where level='error' order by timestamp asc limit 5)

这将为我提供任何与日志(log)记录时间戳匹配的DEBUG_DATA条目.我不确定如何在DEBUG_DATA上实现时间戳间隔 Select .

推荐答案

首先,我们获得日志(log)表中的5个最新条目.然后,我们获取MIN()和Max()时间戳值,并将该窗口扩展2分钟.之后,我们在调试表上加入CTE.我在MS SQL中工作,但我认为这在Postgre中也适用.

 WITH GetTop5 AS (
      SELECT timestamp
      FROM logging
      WHERE where level='error' order by timestamp desc limit 5

 ),
 GetMinMax AS (
       SELECT MAX(timestamp) + interval '2 min' as 'max_timestamp',
              MIN(timestamp) - interval '2 min' as 'min_timestamp'
       FROM GetTop5

 )
 SELECT * FROM debug_data d
     JOIN GetMinMax ON
         d.timestamp >= GetMinMax.min_timestamp
         AND d.timestamp <= GetMinMax.max_timestamp

简化版:

WITH GetTop5 AS (
      SELECT timestamp
      FROM logging
      WHERE where level='error' order by timestamp desc limit 5

 )
 SELECT * FROM debug_data d
     JOIN GetTop5 ON
         d.timestamp >= MIN(timestamp) - interval '2 min'
         AND d.timestamp <= MAX(timestamp) + interval '2 min'

Sql相关问答推荐

在多个柱上连接时,如何确定连接条件?

如何更新SQLite数据库中的表?

直接加法(1+1)与聚合函数SUM(1+1)的区别是什么

我可以在SQLite3中使用BLOB作为主键吗?

在PostgreSQL中汇总连接表中的 case 值

将JSON文件导入Postgres 16数据库时出错(22P04上次预期列之后的额外数据)

如何简化此PostgreSQL查询以计算平均值?

如何使用Clickhouse的COUNT聚合返回所有列,但GROUP BY是这些列的子集

从重复值中获取最新值

SQL Server 查询 WHERE LIKE

递归 CTE 附加为行

SQL 中的第一个值和倒数第二个值

如何为给定的股票数据集计算利润/亏损,确保先卖出先买入的股票

带有数组输入参数的Snowflake UDF优化

PostgreSQL如何将Unix纪元时间戳转换为日期时间并进行拼接

根据行号将列转置为没有任何id或键列的行

如何在 ClickHouse SQL 中使用 CTE 将邻居语句中的数字作为偏移量传递?

postgres按组消除分区中的NULLS

Django only() 和 values() 不适用于 prefetch_related()

如何跨行合并以删除 SQL 中的空值?