我想知道是否有可能运行,告诉我一个查询以下内容:
Mysql的比较当前结果平均结果在一个查询
得到有任何应用程序的名称(目前执行)工作超过历史平均运行时间
表1:作业历史
- 工作开始时间
- 工作结束时间
- 工作状态(成功,失败,执行等)触发的工作
表2
- ID
- 名称
这似乎是一个简单的问题来回答,但创建一个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 |
+------+------------------+
我想抓住作业4,使用application_id
找到JOB1和作业3。然后取平均运行时间job1和job3,并将其与当前运行时间job4进行比较。如果当前运行时间大于平均运行时间,那么我想报告应用程序名称:Team Green的应用程序。
你可能有更多的成功,如果你提供的样本数据和预期的结果。 – sgeddes