有一个jobs
表,
| JobID|状态|时间戳|
| --|--|--|
| 1 |inProgress| 2023-11-02 10:39:37|
| 1 |一些随机日志|2023-11-02 10:40:37|
| 2 |inProgress| 2023-11-02 10:43:37|
| 1 |inProgress| 2023-11-02 10:44:37|
| 1 |inProgress| 2023-11-02 10:45:37|
| 1 |inProgress| 2023-11-02 10:50:00|
| 1 |端|2023-11-02 11:40:37|
| 1 |inProgress| 2023-11-02 11:43:37|
| 1 |inProgress| 2023-11-02 11:44:37|
| 1 |端|2023-11-02 11:45:37|
| 2 |一些随机日志|2023-11-02 11:50:37|
| 2 |端|2023-11-02 12:00:37|
我想
1.计算有多少作业正在进行(即已经开始但尚未结束)
我最初以为可以计算count(state=inProgress)-count(state=end)
来获得inProgress作业的数量,但inProgress
可能不只出现一次。
1.获取每个已完成作业的执行持续时间
请注意,一个作业可以执行多次,例如jobID1
从开始到结束执行两次,因此需要为jobID1
计算两个执行持续时间。jobID1
执行持续时间为time diff between 2023-11-02 11:40:37, 2023-11-02 10:39:37
且time diff between 2023-11-02 11:45:37, 2023-11-02 11:43:37
jobID2
执行持续时间为time diff between 2023-11-02 12:00:37, 2023-11-02 10:43:37
3条答案
按热度按时间kgsdhlau1#
字符串
根据上面的数据示例,这里有一个建议:
型
查询操作如下:
1.获取所有state=end的时间戳,并分配行号-行号用作新组。
1.将第一个查询 Package 为公共表表达式,然后执行另一个查询以创建自定义表。
1.将第二个查询 Package 为另一个公共表表达式,并使用具有以下条件的作业表对其执行LEFT JOIN查询:
jobs.timestamp
的值大于之前设置的NULL值(如果NULL值为NULL,则会分配0
)。jobs.timestamp
值小于或等于我们从第一个查询中提取的end_time
值。这里有一个小提琴供参考:https://dbfiddle.uk/RBEHLuji
cidc1ykv2#
对于可能具有多个示例的作业,以下方法“向后看”以定位相同作业id的任何先前结束,jobid的每个示例也是使用
row_number()
分配的。然后,这些表示“结束”的行与表示“进行中”的任何行连接,条件是确保它们适合“前一个结束”(或NULL)和“此结束”然后计算每个作业示例的最小开始,并且还使持续时间(以秒为单位)可用。字符串
| JobID|工作指令|开始时间|结束时间|度秒|
| --|--|--|--|--|
| 1 | 1 |2023-11-02 10:39:37| 2023-11-02 11:40:37| 3660 |
| 1 | 2 |2023-11-02 11:43:37| 2023-11-02 11:45:37| 120 |
| 2 | 1 |2023-11-02 10:43:37| 2023-11-02 12:00:37| 4620 |
请参阅fiddle
一旦你有了作业和它们的示例,最小/最大开始/结束和总持续时间可以很容易地从上面看到的结果计算出来(也可以选择显示max(job_inst))。
型
bqf10yzr3#
要计算正在进行的作业(已开始但尚未完成)的数量,请执行以下操作:
字符串
要计算每个已完成作业的执行持续时间,请执行以下操作:
型