我想知道是否可以运行一个告诉我以下内容的查询:
获取具有(当前正在执行)作业超过平均历史运行时间的任何应用程序的名称
表1:工作经历
表2:应用程序
这似乎是一个简单的问题,但是创建一个mysql查询已被证明是一个相当复杂的(虽然有趣)挑战......
查询需要抓取 satus = executing
的作业,使用 application.id
查找匹配的其他作业application.id
和 status = success
,平均(end_time
- start_time
),然后比较使用当前正在执行的作业的(average time
- current_time
) start_time
。最后,它必须使用未通过此测试的任何作业中的应用程序ID从应用程序表中获取 application.name
。这甚至可以在一个查询中完成吗?
为了这个问题,让我们假设 current_time
作为参数传递。
我尝试了三重嵌套查询,但是我收到了以下错误,我不知道为什么。我花了几个小时试图让它发挥作用,但我已经在我的头上了:
ERROR 1054 (42S22): Unknown column 'jh.start_time' in 'having clause'
这是我的尝试:
SELECT name FROM application
WHERE application.id IN (
SELECT application_id
FROM job_history AS jh
WHERE application_id IN (
SELECT application_id
FROM job_history
WHERE status='EXECUTION' )
AND jh.status='SUCCESS'
HAVING (avg(jh.end_time - jh.start_time)) < (current_time - jh.start_time)
);
编辑:根据建议,这里有一些示例数据。
表1
+--------+------------+------------+----------+----------------+
| job_id | status | start_time | end_time | application_id |
+--------+------------+------------+----------+----------------+
| job1 | successful | 100 | 200 | app1 |
| job2 | failed | 150 | 350 | app2 |
| job3 | successful | 200 | 400 | app1 |
| job4 | execution | 500 | 0 | app1 |
| job5 | successful | 600 | 800 | app3 |
+--------+------------+------------+----------+----------------+
表2
+------+------------------+
| id | name |
+------+------------------+
| app1 | Team Green's app |
| app2 | Team Blue's app |
| app3 | Team Red's app |
+------+------------------+
我想抓住 job4 ,使用application_id
找到 job1 和 job3 。然后获取 job1 和 job3 的平均运行时间,并将其与 job4 的当前运行时间进行比较。如果当前运行时间大于平均运行时间,那么我想报告应用程序名称: Team Green的应用程序。
答案 0 :(得分:1)
如果我正确理解您的问题,可以使用from types import StringType, UnicodeType
from typing import Union
MyStringTypes = Union[StringType, UnicodeType]
def f(value):
# type: (MyStringTypes) -> MyStringTypes
return value
作为一个选项。从这里开始,您可以根据需要轻松调整join
条件:
where