查询以比较同一表中的两列并根据特定条件更新第三列

时间:2015-05-28 16:14:01

标签: sql-server

我的要求如下, 客户端可以有多个引用,每个引用都有一个Servicestartdateid和ServiceEnddateid。目标是根据以下条件使用ServicestartDateId填充CaseopenedDateID,(1)如果有持续的持续服务,则选择最早的servicestartdate并填充caseopenedDateID,(2)如果服务中断,则选择最早的重新打开日期并填充caseopeneddateid 这应该是方案1结果集如何看起来像

SourceSystemClientID ReferralID ServiceStartDateID ServiceEndDateID CaseOpenedDateID

8901               R43           20080401          20100628         20080401              
8901               R54           20080627          20090212         20080401              
8901               R66           20090210          20121116         20080401

这应该是方案2结果集如何看起来像

SourceSystemClientID ReferralID ServiceStartDateID ServiceEndDateID CaseOpenedDateID

12334              R78         20080401         20100628       20080401            
12334              R88         20080627             20090212       20080401            
12334              R98         20090210             20121116       20080401            
12334          R102        20140901         20141201       20140901            
12334          R107        20141001         20141217       20140901            

2 个答案:

答案 0 :(得分:1)

我已更新我的查询以考虑您的更新:

Select  y.SourceSystemClientID, 
        y.ServiceStartDateID, 
        y.ServiceEndDateID,  
        Res = (select top 1 y2.ServiceStartDateID 
               from yourtable y1
                       inner join yourtable y2
                          ON y1.SourceSystemClientID = y2.SourceSystemClientID 
                             AND y1.ServiceStartDateID <= y2.ServiceEndDateID
               where y.SourceSystemClientID = y1.SourceSystemClientID
                     AND y.ServiceEndDateID = y1.ServiceEndDateID
               order by y2.ServiceStartDateID ) 
from yourtable y        

以下是您可以用来测试查询的fiddle

答案 1 :(得分:0)

这应该适合你:

;WITH Q2
AS (
    SELECT t.SourceSystemClientID
        ,t.ServiceStartDateID
        ,t.ServiceEndDateID
        ,CASE 
            WHEN t.ServiceStartDateID <= LAG(t.ServiceEndDateID) OVER (
                    PARTITION BY t.SourceSystemClientID ORDER BY t.ServiceStartDateID
                    )
                THEN 0
            ELSE t.ServiceStartDateID
            END CaseOpenedDateID
    FROM your_table t      --replace this with your tablename
    )

SELECT q2.SourceSystemClientID
    ,q2.ServiceStartDateID
    ,q2.ServiceEndDateID
    ,max(q2.CaseOpenedDateID) OVER (
        PARTITION BY q2.SourceSystemClientID ORDER BY q2.ServiceStartDateID
        ) as CaseOpenedDateID
FROM q2
GROUP BY q2.SourceSystemClientID
    ,q2.ServiceStartDateID
    ,q2.ServiceEndDateID
    ,q2.CaseOpenedDateID