如何构建含窗口函数的SQL查询:统计员工主接来电前支援次数
解决方案
要实现这个需求,核心是按日期分组,统计每条主接记录产生前,该员工作为支援者的累计次数。可以通过窗口函数结合行号排序来完成,具体步骤如下:
1. 标记当日来电顺序
首先给每条来电记录按日期分组,按来电先后生成行号(用来确定记录的先后关系)。如果你的表没有明确的时间戳字段(如CallTime),可以用表的主键(比如CallID)代替,确保顺序的唯一性。
2. 窗口函数统计累计支援次数
使用SUM() OVER()窗口函数,限定统计范围为当前记录之前的同日期记录,筛选出支援者等于当前主接人的记录并计数。
完整SQL查询
WITH ranked_calls AS ( SELECT *, -- 按日期分组,按来电时间/主键排序生成当日行号 ROW_NUMBER() OVER (PARTITION BY Date ORDER BY CallTime) AS daily_call_rank FROM your_table_name -- 替换成你的实际表名 ) SELECT CallAnsweredBy, SupportedBy, Outcome, Date, -- 统计当前记录之前,该主接员工作为支援者的次数 SUM(CASE WHEN SupportedBy = CallAnsweredBy THEN 1 ELSE 0 END) OVER ( PARTITION BY Date, CallAnsweredBy ORDER BY daily_call_rank ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) AS prior_support_count FROM ranked_calls ORDER BY Date, daily_call_rank;
关键逻辑说明
PARTITION BY Date, CallAnsweredBy:仅在同一日期和同一主接员工的范围内统计。ORDER BY daily_call_rank:确保统计按来电顺序从前到后进行。ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING:限定统计范围为当前记录之前的所有行,不包含当前行本身。CASE WHEN SupportedBy = CallAnsweredBy THEN 1 ELSE 0 END:筛选出该员工作为支援者的记录,转换为可求和的数值。
验证示例
针对你给出的示例数据,执行后的结果如下:
| CallAnsweredBy | SupportedBy | Outcome | Date | daily_call_rank | prior_support_count |
|---|---|---|---|---|---|
| TeamMem1 | TeamMem2 | 10 | 20230101 | 1 | 0 |
| TeamMem2 | TeamMem1 | 10 | 20230101 | 2 | 1 |
| TeamMem3 | TeamMem1 | 9 | 20230101 | 3 | 0 |
| TeamMem2 | TeamMem1 | 5 | 20230101 | 4 | 1 |
| TeamMem3 | TeamMem4 | 4 | 20230101 | 5 | 0 |
结果完全符合预期:第2条记录中TeamMem2的累计支援次数为1,第3条记录中TeamMem3的次数为0。
内容的提问来源于stack exchange,提问作者643gdp
相关产品推荐
相关产品推荐

