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

SQL Server 条件自连接实现未接来电回拨信息统计需求

调整思路

你现有代码使用的是隐式内连接,仅能返回有对应回拨记录的未接来电,要覆盖两类未接来电场景,核心是改为左连接保留全部未接来电记录,具体调整如下:

  • 将回拨表的匹配规则从WHERE子句迁移到LEFT JOIN的ON子句,避免无回拨的未接来电被过滤
  • 用CASE表达式动态生成IsContactedAgain字段值,匹配到回拨记录标记为YES,否则标记为NO
  • 补全需求要求的Caller、Receiver输出字段,无回拨时回拨时间、回拨时长字段自动返回NULL
  • 若需要直接生成MissedCallDetails表,可在SELECT后增加INTO MissedCallDetails子句

调整后完整代码

SELECT
    -- 补全需求要求的基础字段
    m.Caller,
    m.Receiver,
    m.StartedAt AS MissedCallAt,
    r.StartedAt AS CalledBackAt,
    -- 动态判断是否有回拨
    CASE WHEN r.StartedAt IS NOT NULL THEN 'YES' ELSE 'NO' END AS IsContactedAgain,
    DATEDIFF(mi, m.StartedAt, r.StartedAt) AS 'AnsweredMissedCall(In minutes)'
-- 可选:直接生成目标表 去掉下一行的注释即可
-- INTO MissedCallDetails
FROM 
    CallDetails m
LEFT JOIN CallDetails r
    ON  r.Receiver = m.Caller -- 原被叫回拨给原主叫,你原代码里写的r.Recipient和你给出的表结构字段不一致,已按你提供的表结构修正为Receiver,实际字段名如果是Recipient改回去即可
    AND r.StartedTimestamp > m.LastModifiedTimestamp
    AND r.Direction = 'Outbound'
WHERE 
    -- 筛选前一天的未接来电
    CONVERT(char(10), m.StartedAt,126) = DATEADD(Day, -1, CAST(GETDATE() AS Date)) 
    AND m.Outcome = 'Missed call'
    -- 原代码的m.UserId IS NULL 条件如果不需要可以直接删除
    AND m.UserId IS NULL 
ORDER BY 
    m.StartedAt, r.StartedAt

额外说明

如果同一个未接来电存在多条回拨记录,上述代码会返回多条对应记录,若需要每个未接来电只返回最早的一条回拨记录,可以加ROW_NUMBER()窗口函数过滤重复的未接来电行。

内容的提问来源于stack exchange,提问作者I Love Stackoverflow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:24:00