如何识别单日Tier 2登录坐席并将其从Extended Worktime统计报表中排除
解决方案
完全可以通过SQL查询实现你的两个需求,无需调整数据导入逻辑,具体实现如下:
需求1:识别同一日期下仅单行出现的数据行
使用窗口函数按AgentID+登录日期分组统计记录数,过滤出计数为1的行即可,示例代码:
SELECT * FROM ( SELECT *, COUNT(*) OVER (PARTITION BY AgentID, DATE(LoginDateTime)) AS daily_record_cnt FROM 你的表名 ) t WHERE daily_record_cnt = 1
不同数据库的日期转换函数可对应调整:SQL Server用CAST(LoginDateTime AS DATE)、Oracle用TRUNC(LoginDateTime)。
需求2:排除当日归属Tier2的坐席,统计剩余坐席的Extended Worktime总时长
实现思路
- 第一步:提取每日所有登录类型(
Type='L')的记录,得到当日每个坐席ID对应的所属组别(ClassName),这部分记录的ClassName是完整填充的。 - 第二步:将上述结果作为公共表达式(CTE),和原表通过
AgentID、登录日期关联,给原表所有行补全对应坐席的当日所属组别。 - 第三步:过滤掉组别为
Tier 2的所有记录,统计剩余记录中BreakReason='Extended Worktime'的Duration总和即可。
示例代码
WITH agent_daily_class AS ( SELECT AgentID, DATE(LoginDateTime) AS login_date, ClassName FROM 你的表名 WHERE Type = 'L' ) SELECT a.AgentID, a.Agent_First_Name, SUM(a.Duration) AS total_extended_worktime FROM 你的表名 a JOIN agent_daily_class c ON a.AgentID = c.AgentID AND DATE(a.LoginDateTime) = c.login_date WHERE c.ClassName != 'Tier 2' AND a.BreakReason = 'Extended Worktime' GROUP BY a.AgentID, a.Agent_First_Name
测试验证
基于你提供的样例数据表运行上述代码,会自动过滤掉归属Tier2的John的所有记录,仅统计Dave的Extended Worktime总时长为142+112=254,符合预期。
样例数据表
| ROWID | Agent_First_Name | Type | AgentID | Exno | Duration | LoginDateTime | BreakReason | Class | ClassName |
|---|---|---|---|---|---|---|---|---|---|
| 61272 | Dave | L | 100 | 3382 | 0 | 17/11/2021 08:00:24 | 10 | Tier 1 | |
| 61273 | Dave | W | 100 | 142 | 17/11/2021 08:07:24 | Extended Worktime | 0 | ||
| 61274 | Dave | W | 100 | 112 | 17/11/2021 08:15:24 | Extended Worktime | 0 | ||
| 61275 | John | L | 320 | 4201 | 0 | 17/11/2021 09:04:24 | 9 | Tier 2 | |
| 61276 | John | W | 320 | 100 | 17/11/2021 10:13:24 | Extended Worktime | 0 | ||
| 61277 | John | W | 320 | 85 | 17/11/2021 11:15:24 | Extended Worktime | 0 |
内容的提问来源于stack exchange,提问作者Matt Walmsley
相关产品推荐
相关产品推荐

