You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建含窗口函数的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:筛选出该员工作为支援者的记录,转换为可求和的数值。

验证示例

针对你给出的示例数据,执行后的结果如下:

CallAnsweredBySupportedByOutcomeDatedaily_call_rankprior_support_count
TeamMem1TeamMem2102023010110
TeamMem2TeamMem1102023010121
TeamMem3TeamMem192023010130
TeamMem2TeamMem152023010141
TeamMem3TeamMem442023010150

结果完全符合预期:第2条记录中TeamMem2的累计支援次数为1,第3条记录中TeamMem3的次数为0。

内容的提问来源于stack exchange,提问作者643gdp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:08:47