0

以下の SQL クエリがあり、Consult、SIM、PLAN、TreatmentStart、および TreatmentFinish の結果が複数あることがわかりました。

MAX最新の結果のみを表示しますが、Planning は TreatmentStart の直前の日付を表示し、SIM は Plan の日付の直前の日付を表示します。

開始日は、最新の TreatmentStart 日付に基づいています。

完了するのに2分以上かかる長くて複雑なSQLクエリを書いたので、誰かが私を正しい方向に向けることができるかどうか疑問に思っています...

クエリは次のとおりです。

SELECT  s.Pat_Name, s.IDA, s.Pat_ID1, 
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 
WHERE   s.Activity IN ('123', '456', '789')
OR      s.SysDefStatus IN ('SC', 'FC', 'C')
GROUP BY s.Pat_Name, s.IDA, s.Pat_ID1

)

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;
4

2 に答える 2

0

MAX(dtmColumn) WHERE dtmColumn < dtmColumn2 を選択すると、最も近い最新の日付を取得できませんか? これにより、dtmColumn2 に最も近い dtmColumn で結果が得られるはずですが、明らかに前の日付のみです。

それを行う最も簡単な方法のように思えますが、あなたのケースは複雑すぎて簡単に修正できないと想像できます。

于 2013-11-05T07:23:45.810 に答える
0

以下のクエリは、私が望むように機能し、正しい結果を表示しています。

WITH PatCPlanRanked AS (
SELECT
Pat_ID1,
Tx_Intent,
Eff_DtTm,
Ranking = ROW_NUMBER() OVER (PARTITION BY Pat_ID1 ORDER BY Eff_DtTm DESC)
FROM PatCPlan
),
T AS (
SELECT s.IDA, s.Pat_ID1, s.Pat_Name, TreatmentStartDate = MAX(CASE WHEN s.SysDefStatus = 'SC' THEN s.App_DtTm END),
MAX(t.App_DtTm) AS PlanDate, MAX(u.App_DtTm) AS SIMDate, MAX(c.App_DtTm) AS ConsultDate,
ShortDesc = MAX(CASE WHEN s.SysDefStatus = 'SC' THEN s.Short_Desc END), p.Tx_Intent,
Location = MAX(CASE WHEN s.SysDefStatus = 'SC' THEN s.Location END)
FROM vw_Schedule s
LEFT OUTER JOIN vw_Schedule t
ON s.Pat_ID1 = t.Pat_ID1
LEFT OUTER JOIN vw_Schedule u
ON s.Pat_ID1 = u.Pat_ID1
LEFT OUTER JOIN vw_Schedule c
ON s.Pat_ID1 = c.Pat_ID1
LEFT OUTER JOIN PatCPlanRanked p
ON s.Pat_ID1=p.Pat_ID1 AND p.Ranking = 1

WHERE s.SysDefStatus IN ('SC') AND t.App_DtTm < s.App_DtTm AND u.App_DtTm < t.App_DtTm AND c.App_DtTm < u.App_DtTm 
AND t.Activity IN ('123')
AND u.Activity IN ('456') 
AND c.Activity IN ('789') 
AND c.SysDefStatus IN (' C') 
GROUP BY s.IDA, s.Pat_ID1, s.Pat_Name, p.Tx_Intent
)

SELECT  IDA, 
    Pat_Name,
    ShortDesc,
    Tx_Intent,
    Location,
    ConsultDate,
    Days = (DATEDIFF(dd, ConsultDate, SimDate))-(DATEDIFF(wk, ConsultDate, SimDate)*2),
    SimDate,
    Days = (DATEDIFF(dd, SimDate, PlanDate))-(DATEDIFF(wk, SimDate, PlanDate)*2),
    PlanDate,
    Days = (DATEDIFF(dd, PlanDate, TreatmentStartDate))-(DATEDIFF(wk, PlanDate, TreatmentStartDate)*2),
    TreatmentStartDate
FROM T

ただし、クエリが完了するまでに約 35 秒かかります。これを最適化する方法について誰かアドバイスをいただけますか?

みんな乾杯

于 2013-11-06T09:15:23.280 に答える