求助:编写SQL查询按季度计算工单平均解决时间
解决季度平均解决时间的SQL查询方案
别发愁,这事儿不难!我帮你梳理一下实现思路,再给你适配不同数据库的具体代码,完全贴合你要的输出格式。
核心思路
我们需要做三件事:
- 从
closed date字段里提取对应的季度(Q1-Q4) - 按季度对工单分组,计算每组
resolve time的平均值 - 把结果格式化成你要的
Quarter | days样式
分数据库实现代码
不同数据库提取季度的函数略有不同,我给你列几种常用的:
1. MySQL/MariaDB
SELECT CONCAT('Q', QUARTER(closed_date)) AS Quarter, ROUND(AVG(resolve_time), 0) AS days FROM your_ticket_table -- 替换成你的实际表名 GROUP BY QUARTER(closed_date) ORDER BY QUARTER(closed_date);
QUARTER(closed_date):直接提取日期对应的季度(1-4)CONCAT('Q', ...):把数字季度转成Q1这种格式ROUND(AVG(...), 0):计算平均值并取整,和你示例里的整数结果一致GROUP BY按季度分组,ORDER BY保证Q1到Q4的顺序
2. PostgreSQL
SELECT CONCAT('Q', EXTRACT(QUARTER FROM closed_date)) AS Quarter, ROUND(AVG(resolve_time)) AS days FROM your_ticket_table -- 替换成你的实际表名 GROUP BY EXTRACT(QUARTER FROM closed_date) ORDER BY EXTRACT(QUARTER FROM closed_date);
PostgreSQL用EXTRACT(QUARTER FROM 日期)来获取季度数值,其他逻辑和MySQL一致。
3. SQL Server
SELECT 'Q' + CAST(DATEPART(QUARTER, closed_date) AS VARCHAR) AS Quarter, ROUND(AVG(resolve_time), 0) AS days FROM your_ticket_table -- 替换成你的实际表名 GROUP BY DATEPART(QUARTER, closed_date) ORDER BY DATEPART(QUARTER, closed_date);
SQL Server用DATEPART(QUARTER, 日期)提取季度,再用CAST转成字符串拼接成Q1格式。
验证你的示例场景
假设第一季度有5条工单,resolve_time分别是10、1、3、1、10,代入上面的查询后:
- 平均值计算:
(10+1+3+1+10)/5 = 5 - 输出会是
Q1 | 5,完全符合你的示例要求。
扩展提示(可选)
如果你的数据跨年度,需要区分不同年份的季度(比如2023Q1、2024Q1),只需要在查询里加上年份即可,比如MySQL版本可以改成:
SELECT CONCAT(YEAR(closed_date), 'Q', QUARTER(closed_date)) AS Quarter, ROUND(AVG(resolve_time), 0) AS days FROM your_ticket_table GROUP BY YEAR(closed_date), QUARTER(closed_date) ORDER BY YEAR(closed_date), QUARTER(closed_date);
内容的提问来源于stack exchange,提问作者Nisha Verma
相关产品推荐
相关产品推荐

