Grafana对接Postgres:工单耗时平均值计算问题求助
问题分析与SQL修正
原代码核心问题
- 外层查询仅计算了
lol的平均值,未选择time列,因此无法查看时间维度的数据 - 子查询分组逻辑偏差:
GROUP BY updated_on, ticket_id会将每个工单的每一条更新记录单独分组,此时SUM(time_spent_minutes)仅代表该工单在当前更新时间点的耗时总和,并非工单的总耗时,最终计算的平均值并非真正的工单平均耗时
修正方案(分场景)
场景1:按时间(updated_on)统计该时间点的工单平均耗时
如果需要按时间维度查看每个时间点下所有工单的平均耗时,调整代码如下:
SELECT m.updated_on AS "time", AVG(m.total_time_per_ticket) AS avg_ticket_time FROM ( SELECT ticket_id, updated_on, SUM(time_spent_minutes) AS total_time_per_ticket FROM ticket_messages WHERE admin_id IN ('20439','20457','20291','20371','20357','20235','20449','20355','20488') GROUP BY ticket_id, updated_on ) AS m GROUP BY m.updated_on ORDER BY m.updated_on;
说明:子查询先按工单+时间分组,计算每个工单在对应时间的总耗时;外层再按时间分组,计算该时间点所有工单的平均耗时,同时保留time列。
场景2:查看每个工单的耗时及对应更新时间
如果需要输出每个工单在对应时间的总耗时、单条更新的平均耗时,直接按工单+时间分组即可:
SELECT ticket_id, updated_on AS "time", SUM(time_spent_minutes) AS total_time, AVG(time_spent_minutes) AS avg_time_per_update FROM ticket_messages WHERE admin_id IN ('20439','20457','20291','20371','20357','20235','20449','20355','20488') GROUP BY ticket_id, updated_on ORDER BY updated_on, ticket_id;
场景3:按天统计工单日均平均耗时
如果需要按天(或其他时间粒度)统计,可对updated_on做时间截断(以MySQL为例):
SELECT DATE(m.updated_on) AS "date", AVG(m.total_time_per_ticket) AS daily_avg_ticket_time FROM ( SELECT ticket_id, updated_on, SUM(time_spent_minutes) AS total_time_per_ticket FROM ticket_messages WHERE admin_id IN ('20439','20457','20291','20371','20357','20235','20449','20355','20488') GROUP BY ticket_id, updated_on ) AS m GROUP BY DATE(m.updated_on) ORDER BY DATE(m.updated_on);
内容的提问来源于stack exchange,提问作者Hugo Hora
相关产品推荐
相关产品推荐

