MySQL 中 SELECT 语句中的多个聚合

问题描述 投票:0回答:1

我有一个这样的表(开始和结束时间是纪元秒)

作业_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`
sql mysql aggregate-functions
1个回答
0
投票

您只需在子查询中对每个作业 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
© www.soinside.com 2019 - 2024. All rights reserved.