首页 > 解决方案 > SQL Server - 条件自联接

问题描述

我有如下表格:

通话详情

呼叫者 接收者 开始于 开始时间戳 LastModified时间戳 结果 方向
111111 91919 13.39 1636342600 1636342601 错过 入站
111111 91919 15.40 1636342828 1636343128 错过 入站
91919 111111 19.45 1636400728 1636401028 已回答 出境
222222 91919 20.50 1636404628 1636405000 错过 入站

预期输出:

未接电话详情

呼叫者 接收者 未接来电 CalledBackAt 再次联系 已接未接来电(以分钟计)
111111 91919 15.40 19.45 是的 245
222222 91919 20.50

联合的两个主要条件如下:

  1. 当接收者向同一呼叫者返回呼叫时 - 应该考虑IsContactedAgain = YES

  2. 当呼叫没有返回LastModifiedTimestamp给呼叫者之后

我需要一个未接来电的联合体,它们是answeredunanswered

到目前为止,我想出了以下内容:

SELECT
    m.StartedAt AS MissedCallAt
    , r.StartedAt AS CalledBackAt
    , 'Y' AS IsContactedAgain
    , DATEDIFF(mi, m.StartedAt, r.StartedAt) AS 'CalledIn(Minutes)'
FROM 
    CallDetails m, CallDetails r
WHERE 
    CONVERT(char(10), M.StartedAt,126) = DATEADD(Day, -1, CAST( GETDATE() AS Date)) 
    AND m.UserId IS NULL 
    AND m.Outcome = 'Missed call'
    AND r.Recipient = m.Caller
    AND r.StartedTimestamp > m.LastModifiedTimestamp
    AND r.Direction = 'Outbound'
ORDER BY 
    m.StartedAt, r.StartedAt

标签: sqlsql-servertsqlself-join

解决方案


左连接在这里可以用来包含未接来电而没有回调。

SELECT m.StartedAt AS MissedCallAt
, r.StartedAt AS CalledBackAt
, CASE WHEN r.StartedAt IS NOT NULL THEN 'YES' ELSE 'NO' END AS IsContactedAgain
, DATEDIFF(minute, m.StartedAt, r.StartedAt) AS [CalledIn(Minutes)] 
FROM CallDetails m
LEFT JOIN CallDetails r 
  ON r.Direction = 'Outbound'
 AND r.Recipient = m.Caller
 AND r.Caller = m.Recipient
 AND r.StartedTimestamp > m.LastModifiedTimestamp
WHERE m.Direction = 'Inbound' 
  AND m.Outcome = 'Missed call'
  AND m.StartedAt > DATEDIFF(SECOND,'1970-01-01', DATEADD(Day, -1, CAST(GETUTCDATE() AS DATE)))
ORDER BY m.StartedAt, r.StartedAt

推荐阅读