SQL Server:与组中的下一个X进行比较

Sea*_*anC 7 sql-server sql-server-2012

我知道我可以用LAG和比较上一行/下一行LEAD,但是在我正在进行的比较中; 我需要能够偶尔跳过行(但仍需要确认它们)

细节:我试图跟踪咨询,以及呼叫环境中的冷暖转移.每个呼叫都有一个唯一的密钥,每个阶段都有一个递增的员工编号.它还具有每个呼叫段的开始和结束时间.
咨询被定义为在前一个非咨询段结束之前开始和结束的调用.
热转移是前一个分段的末尾在前一个分段开始之后,在前一个分段结束之后结束的转移.
冷转移是在上一个分段结束后开始的分段.

示例数据:

topcallid   e_created       e_terminated    empnum
EG995GIFM   16:22:40.933    16:29:51.010    1
EG995GIFM   16:25:59.827    16:27:49.027    2
EG995GIFM   16:30:07.453    16:37:44.500    3
EG995GIFM   16:38:01.677    16:59:30.777    4
EG995GIFM   16:59:46.737    17:16:48.397    5
EG995GIFM   17:04:51.243    17:29:21.620    6

期望的输出:

topcallid.......TransStatus  
EG995GIFM   Consult (Stage 1 To 2)  
EG995GIFM   Cold Transfer (Stage 1 To 3)  
EG995GIFM   Cold Transfer (Stage 3 To 4)  
EG995GIFM   Cold Transfer (Stage 4 To 5)  
EG995GIFM   Warm Transfer (Stage 5 To 6)  
Run Code Online (Sandbox Code Playgroud)

当前代码,它将每个阶段与以下所有阶段进行比较:

SELECT ta.topcallid,
       CASE 
            WHEN ta.e_created < Trans.e_created AND ta.e_terminated > Trans.e_terminated THEN 'Consult (Stage ' + CAST(TA.EmpNum AS VARCHAR(3)) + ' To ' + CAST(Trans.EmpNum AS VARCHAR(3)) + ')'
            WHEN ta.e_terminated < Trans.e_created THEN 'Cold Transfer (Stage ' + CAST(TA.EmpNum AS VARCHAR(3)) + ' To ' + CAST(Trans.EmpNum AS VARCHAR(3)) + ')'
            WHEN ta.e_terminated > Trans.e_created THEN 'Warm Transfer (Stage ' + CAST(TA.EmpNum AS VARCHAR(3)) + ' To ' + CAST(Trans.EmpNum AS VARCHAR(3)) + ')'
       END TransStatus
FROM   [TransferTypeAnalysis] TA
       JOIN [TransferTypeAnalysis] Trans
            ON  TA.topcallid = Trans.topcallid
                AND ta.empnum < Trans.empnum
ORDER BY
       TA.topcallid,
       ta.empnum
Run Code Online (Sandbox Code Playgroud)

小智 4

看来您需要一个子查询来与之前终止的调用进行比较。此逻辑假设每个呼叫 ID 的终止时间是唯一的。

select 
    t3.topcallid, 
    case when t3.e_created < t4.e_created and t3.e_terminated > t4.e_terminated then 'Consult (Stage ' +  cast(t3.EmpNum as varchar(3)) + ' To ' + cast(t4.EmpNum as varchar(3)) + ')'
        when t3.e_terminated < t4.e_created then 'Cold Transfer (Stage ' +  cast(t3.EmpNum as varchar(3)) + ' To ' +  cast(t4.EmpNum as varchar(3)) + ')'
        when t3.e_terminated > t4.e_created then 'Warm Transfer (Stage ' +  cast(t3.EmpNum as varchar(3)) + ' To ' +  cast(t4.EmpNum as varchar(3)) + ')'
        end TransStatus
from
    [TransferTypeAnalysis] t3
    INNER JOIN
    (
        select 
            t1.topcallid, t1.empnum, t1.e_created, t1.e_terminated, max(t2.e_terminated) previous_term_dt
        FROM 
            [TransferTypeAnalysis] t1
            left join [TransferTypeAnalysis] t2
            on t1.topcallid=t2.topcallid and t1.empnum>t2.empnum
        GROUP BY t1.topcallid, t1.empnum, t1.e_created, t1.e_terminated
    ) as t4 on t3.topcallid = t4.topcallid and t3.e_terminated = t4.previous_term_dt
Run Code Online (Sandbox Code Playgroud)