2013-10-10 105 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

哦,你太客气了,谢谢! –

相关问题