统计各服务每小时工单处理量的SQL查询问题
业务背景
当前运营应答服务系统工单来自多个不同服务渠道,需要统计员工在各服务渠道下每小时处理的工单数量。
现有情况
目前已编写初步SQL查询语句,可完成小时字段提取,但未实现分组取时段末值的逻辑,现有代码如下:
SELECT gfqueuecounter_counter,hora,gfqueue_desc FROM (SELECT gfqueuecounter_time,gfqueue_desc, gfqueuecounter_counter , SUBSTRING(CONVERT(gfqueuecounter_time,TIME),1,2) as hora FROM gfqueuecounter_v2 WHERE gfqueuecounter_time > '2022-06-07 09:00:00' and gfqueuecounter_time < '2022-06-07 18:00:00') as t1;
字段说明
gfqueuecounter_counter:各服务工单的逐次递增计数器,每产生一张工单计数加1gfqueue_desc:不同工单类型的标识字段hora:子查询中通过CONVERT、SUBSTRING函数从gfqueuecounter_time字段提取的小时值,用于标识记录所属小时
具体需求
获取每个服务类型在每小时时段内的最后一条计数器记录,以此计算对应时段的工单处理量。
实现方案
核心逻辑:按服务类型+小时分组,取每组内计数器值最大的记录,即为对应小时时段的末值记录(计数器严格递增,最大值天然对应时段内最后一条工单)。
支持窗口函数的数据库版本(MySQL 8.0+、PostgreSQL等)
用ROW_NUMBER()窗口函数给分组内记录排序,取每组第一条即可,写法简洁执行效率高:
SELECT gfqueuecounter_counter, hora, gfqueue_desc FROM ( SELECT gfqueue_desc, gfqueuecounter_counter, SUBSTRING(CONVERT(gfqueuecounter_time, TIME), 1, 2) AS hora, ROW_NUMBER() OVER ( PARTITION BY gfqueue_desc, SUBSTRING(CONVERT(gfqueuecounter_time, TIME), 1, 2) ORDER BY gfqueuecounter_counter DESC ) AS rn FROM gfqueuecounter_v2 WHERE gfqueuecounter_time > '2022-06-07 09:00:00' AND gfqueuecounter_time < '2022-06-07 18:00:00' ) AS t1 WHERE rn = 1;
低版本不支持窗口函数的场景
用分组聚合先找到每个分组的最大计数器值,再关联原表取对应记录:
SELECT t1.gfqueuecounter_counter, t2.hora, t1.gfqueue_desc FROM gfqueuecounter_v2 t1 INNER JOIN ( SELECT gfqueue_desc, SUBSTRING(CONVERT(gfqueuecounter_time, TIME), 1, 2) AS hora, MAX(gfqueuecounter_counter) AS max_counter FROM gfqueuecounter_v2 WHERE gfqueuecounter_time > '2022-06-07 09:00:00' AND gfqueuecounter_time < '2022-06-07 18:00:00' GROUP BY gfqueue_desc, SUBSTRING(CONVERT(gfqueuecounter_time, TIME), 1, 2) ) t2 ON t1.gfqueue_desc = t2.gfqueue_desc AND t1.gfqueuecounter_counter = t2.max_counter;
内容的提问来源于stack exchange,提问作者Bernardo Lopes
相关产品推荐
相关产品推荐

