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
相关产品推荐
相关产品推荐

