2013-10-10 43 views
0

以下sql server 2005查詢當前正在成功運行。我需要修改「p.Tx_Intent」以基於同一個表中的日期列「p.Eff_DtTm」進行顯示,因此它只顯示患者的最新Tx_Intent(Eff_DtTm)。根據另一列的日期字段獲取結果

WITH T AS 
(SELECT s.Pat_Name, s.IDA, s.Pat_ID1, p.Tx_Intent, 
    ShortDesc = MAX(CASE WHEN s.SysDefStatus = 'SC' THEN s.Short_Desc END), 
    Consult = MAX(CASE WHEN s.Activity = '123' 
         AND s.SysDefStatus = 'C' THEN s.App_DtTm END), 
    SIM = MAX(CASE WHEN s.Activity = '456' 
          THEN s.App_DtTm END), 
    PLANNING = MAX(CASE WHEN s.Activity = '789' 
          THEN s.App_DtTm END), 
    TreatmentStart = MAX(CASE WHEN s.SysDefStatus = 'SC' THEN s.App_DtTm END), 
    TreatmentFinished = MAX(CASE WHEN s.SysDefStatus = 'FC' THEN s.App_DtTm END) 
FROM vw_Schedule s 
LEFT OUTER JOIN PatCPlan p 
ON s.Pat_ID1=p.Pat_ID1 
WHERE s.Activity IN ('123', '456', '789') 
OR  s.SysDefStatus IN ('SC', 'FC', 'C') 

GROUP BY s.Pat_Name, s.IDA, s.Pat_ID1, p.Tx_Intent 

) 


SELECT Pat_Name, 
IDA, 
    Tx_Intent, 
    ShortDesc, 
    Consult, 
    Days = (DATEDIFF(dd, Consult, SIM)+1)-(DATEDIFF(wk, Consult, SIM)*2), 
    SIM, 
    Days = (DATEDIFF(dd, SIM, PLANNING)+1)-(DATEDIFF(wk, SIM, PLANNING)*2), 
    PLANNING, 
    Days = (DATEDIFF(dd, PLANNING, TreatmentStart)+1)-(DATEDIFF(wk, PLANNING, TreatmentStart)*2), 
    TreatmentStart, 
    Days = (DATEDIFF(dd, TreatmentStart, TreatmentFinished)+1)-(DATEDIFF(wk, TreatmentStart, TreatmentFinished)*2), 
    TreatmentFinished 
FROM T; 

好吧,所以我想出了一種方法來確定最新的日期,我只是有問題結合它與我目前的查詢。這裏是查詢我需要結合頂部查詢

SELECT Pat_ID1, Tx_Intent from (select 
     Pat_ID1 
     ,Tx_Intent 
     ,Eff_DtTm 
     ,row_number() over (partition by Pat_ID1 order by abs(datediff(dd, Eff_DtTm,  getdate()))) Ranking 
    from PatCPlan) xx 
where Ranking = 1 

感謝您的幫助!

+0

您的原始查詢可能並不是一次完成,而是逐漸增長。如果我是你,我會採用同樣的方法,使用你發現的查詢作爲基礎,並圍繞它建立新的查詢。如果你堅持保留舊的查詢,並以某種方式將新的查詢「交織」到其中,試着瞭解它是如何工作的,這應該有所幫助(假設你非常清楚你現在的查詢是如何工作的)。 –

+0

我似乎只能得到它一次顯示1個結果:\ – user2861854

回答

0

不能完全確定,但這裏有雲:

WITH PatCPlanRanked AS ( SELECT Pat_ID1, Tx_Intent, Ranking = ROW_NUMBER() OVER (PARTITION BY Pat_ID1 ORDER BY Eff_DtTm DESC) FROM PatCPlan ), 
T AS 
(SELECT s.Pat_Name, s.IDA, s.Pat_ID1, p.Tx_Intent, 
    ShortDesc = MAX(CASE WHEN s.SysDefStatus = 'SC' THEN s.Short_Desc END), 
    Consult = MAX(CASE WHEN s.Activity = '123' 
         AND s.SysDefStatus = 'C' THEN s.App_DtTm END), 
    SIM = MAX(CASE WHEN s.Activity = '456' 
          THEN s.App_DtTm END), 
    PLANNING = MAX(CASE WHEN s.Activity = '789' 
          THEN s.App_DtTm END), 
    TreatmentStart = MAX(CASE WHEN s.SysDefStatus = 'SC' THEN s.App_DtTm END), 
    TreatmentFinished = MAX(CASE WHEN s.SysDefStatus = 'FC' THEN s.App_DtTm END) 
FROM vw_Schedule s 
LEFT OUTER JOIN PatCPlanRanked p 
ON s.Pat_ID1=p.Pat_ID1 AND p.Ranking = 1 
WHERE s.Activity IN ('123', '456', '789') 
OR  s.SysDefStatus IN ('SC', 'FC', 'C') 

GROUP BY s.Pat_Name, s.IDA, s.Pat_ID1, p.Tx_Intent 

) 


SELECT Pat_Name, 
IDA, 
    Tx_Intent, 
    ShortDesc, 
    Consult, 
    Days = (DATEDIFF(dd, Consult, SIM)+1)-(DATEDIFF(wk, Consult, SIM)*2), 
    SIM, 
    Days = (DATEDIFF(dd, SIM, PLANNING)+1)-(DATEDIFF(wk, SIM, PLANNING)*2), 
    PLANNING, 
    Days = (DATEDIFF(dd, PLANNING, TreatmentStart)+1)-(DATEDIFF(wk, PLANNING, TreatmentStart)*2), 
    TreatmentStart, 
    Days = (DATEDIFF(dd, TreatmentStart, TreatmentFinished)+1)-(DATEDIFF(wk, TreatmentStart, TreatmentFinished)*2), 
    TreatmentFinished 
FROM T; 

我做了一個改變你Ranking表達:ROW_NUMBER函數的OVER子句中,我改變了

ORDER BY ABS(DATEDIFF(dd, Eff_DtTm, GETDATE())) 

到更多sargable

ORDER BY Eff_DtTm DESC 

這相當於你的版本僅當Eff_DtTm永遠不會晚於GETDATE()。但是,我認爲是因爲你對病人

,你的表情表達你的意圖爲(加上強調

所以它只顯示最新 Tx_Intent(Eff_DtTm)的情況下只有在上述假設下才能達到這一目的。

+0

絕對傳說! – user2861854

+0

哦,你太客氣了,謝謝! –

相關問題