我有一个这样的表(开始和结束时间是纪元秒)
作业_ID | 工作类型 | 开始_时间 | 结束时间 |
---|---|---|---|
123 | A | 1234567890 | 1234567890 |
123 | A | 1234567890 | 1234567890 |
456 | B | 1234567890 | 1234567890 |
456 | B | 1234567890 | 1234567890 |
789 | A | 1234567890 | 1234567890 |
789 | A | 1234567890 | 1234567890 |
012 | B | 1234567890 | 1234567890 |
012 | B | 1234567890 | 1234567890 |
我想做的是写一个
SELECT
,首先将每个Job_ID的总工作时间相加,然后计算总工作时间的平均值,按Job_Type分组。
输出:
工作类型 | 平均总时间 |
---|---|
A | 12345 |
B | 12345 |
有两种以上的工作类型 - 这只是一个例子。
让事情变得更复杂的是,我在 JDBC 环境中工作,实际上无法执行创建用户变量等操作。
我设计了一种方法来实现此目的,方法是手动选择每个工作类型字符串文字,然后使用两个子选择来获取总时间和总作业数。问题是这不是动态的或可扩展的,而且我不确定如何以其他方式包含这个逻辑。
我知道我需要
GROUP BY
Job_Type 列,但我不确定如何在取所有时间的平均值之前对时间进行总结。
我的“工作”方法既不可扩展也不动态:
SELECT
'A' AS `Job_Type`,
-- Total Time worked for all Type A
ROUND(
(
SELECT SUM(End_time - Start_time) FROM MyTable
WHERE Job_Type = 'A'
)
/
-- Divide by total Jobs of type A
(
SELECT COUNT(Job_ID) FROM MyTable
WHERE Job_Type = 'A'
)
) AS `Avg_Total_Time`
UNION
SELECT
'B' AS `Job_Type`,
ROUND(
(
SELECT SUM(End_time - Start_time) FROM MyTable
WHERE Job_Type = 'B'
)
/
-- Divide by total Jobs of type B
(
SELECT COUNT(Job_ID) FROM MyTable
WHERE Job_Type = 'B'
)
) AS `Avg_Total_Time`
您只需在子查询中对每个作业 id 的时间进行求和,然后就可以在外部查询中计算出每个作业类型的平均时间:
select Job_Type, avg(job_duration)
from (
select Job_Type, sum(End_Time-Start_Time) job_duration
from MyTable
group by Job_ID, Job_Type
) job_durations
group by Job_Type