【问题标题】:Get all entries where the following entry is not +1 minute获取以下条目不是+1分钟的所有条目
【发布时间】:2020-07-07 08:21:38
【问题描述】:

我有一个表来存储我所有已执行的作业。知道我想知道是否所有作业都正确执行(每分钟)。每个条目都有一个created_at 时间戳。

我现在的问题是如何选择在最后一个条目后 1 分钟未执行的所有条目。我觉得这是一个非常复杂的查询。到目前为止,我的所有条目都按created_at 排序。

SELECT * 
FROM jobs 
WHERE created_at IS NOT NULL 
ORDER By created_at

created_at 是一个时间戳。类似2020-02-02 10:00:00

表结构:

id    job_name  created_at
-----------------------------------
1     ABC       2020-02-02 10:00:00
2     ABC       2020-02-02 10:01:00
3     ABC       2020-02-02 10:02:00
4     ABC       2020-02-02 10:04:00
5     ABC       2020-02-02 10:07:00

我想要的结果是: 现在我想获取所有未执行工作的日期。所以,10:03:0010:05:0010:06:00 的作业没有被执行!

你们有什么想法吗?我猜它是一个递归查询。此查询需要用 postgres 编写。

【问题讨论】:

  • 至少我们需要表结构、样本数据和预期输出
  • @GabrielDurac 补充说,抱歉。我认为它很清楚,因为它并不多
  • 如果第三次是10:02:01呢?时间是 10:02:01

标签: sql postgresql recursion timestamp


【解决方案1】:
WITH Table_with_next AS (
  SELECT
   id
  ,job_name
  ,created_at 
  ,LEAD(created_at) OVER (PARTITION BY job_name ORDER BY created_at) as next_created_at
  FROM jobs 
)
SELECT
   job_name
  ,generate_series(created_at + interval '1 min'
                   ,next_created_at - interval '1 min'
                   ,interval '1 min') as time_not_run
FROM Table_with_next 
WHERE next_created_at-created_at > interval '1 min'

我使用包含 LEAD 分析函数的 CTE 来获取下一次运行时间戳。然后,我过滤了运行之间超过 1 分钟的行,对于这些行,我在运行时间戳和下一次运行时间戳之间生成了 1 分钟的间隔。

你可以在这里玩它:http://sqlfiddle.com/#!17/b237e/11

【讨论】:

    【解决方案2】:

    我猜你希望每日历分钟运行一项工作。这样一来,您就可以避免 59 秒和 61 秒的延迟。

    您不需要lead()。只需生成时间序列并加入或使用not exists

    select gs.job_name, gs.dt
    from (select job_name,
                 generate_series(min(date_trunc('minute', created_at)),
                                 max(created_at), 
                                 interval '1 minute'
                                ) as dt
          from tests
          group by job_name
         ) gs
    where not exists (select 1
                      from tests t
                      where t.job_name = gs.job_name and
                            date_trunc('minute', t.created_at) = gs.dt
                     );
                  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 2023-04-10
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      相关资源
      最近更新 更多