获取以下条目不超过1分钟的所有条目

yftpprvb  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(269)

我有一个表,其中存储了所有执行的作业。知道我想知道是否所有的工作得到正确执行(每分钟)。每个条目都有一个 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:00` ,  `10:05:00` 以及 `10:06:00` 工作没有完成!
你们知道吗?我猜这是一个递归查询。这个查询需要在postgres中编写。
bvjveswy

bvjveswy1#

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/#!2011年2月17日

toe95027

toe950272#

我猜您希望每个日历分钟运行一次作业。这样,你就不会有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
                 );

相关问题