4

MSSQL 2008 R2 を使用しています。別の列に格納されている日付までの最新のデータ日付を取得しようとしています。サブクエリで max(ProcedureDate) を使用して、全体的に最新のデータ日付を取得できます。ただし、列に格納されている日付より前の最新の日付が必要です。

次に例を示します。

Current Table: Procedures       

ID Patient  ProcedureType   ProcedureDate
1  George   ExamA           1/1/2013
2  George   TreatmentA      1/3/2013
2  George   TreatmentB      1/5/2003
4  George   ExamB           2/1/2013
5  George   TreatmentA      2/5/2013

Desired Table:  ProceduresWithLastExam

ID Patient  ProcedureType   ProcedureDate   LastExamDate    DaysSinceLastExam    LastExamType
1  George   ExamA           1/1/2013        1/1/2013        0                    ExamA
2  George   TreatmentA      1/3/2013        1/1/2013        2                    ExamA
3  George   TreatmentB      1/5/2013        1/1/2013        4                    ExamA
4  George   ExamB           2/1/2013        2/1/2013        0                    ExamB
5  George   TreatmentA      2/5/2013        2/1/2013        4                    ExamB

以下を使用しようとしましたが、その患者の最新のデータ日付のみを引き戻します。

select p.*, a.LastExamDate, a.ProcedureType as LastExamType from Procedures p
left join (
   select exams.Patient, exams.ProcedureType, MAX(exams.ProcedureDate) as LastExamDate from Procedures exams
   where ProcedureType like 'Exam%'
   group by exams.Patient, exams.ProcedureType
)a
on p.Patient = a.Patient

すべての行の結果は、LastExamDate として 2/1/13、LastExamType として ExamB です。

左の結合、where 句、およびサブクエリにいくつかの追加の日付パラメーターを含めようとしましたが、成功しませんでした。

正しい日付が返されるまで、datediff ロジックを省略していることに注意してください。

助けてくれてありがとう。

4

2 に答える 2

1

OUTERAPPLYを使用できます。これは相関サブクエリに似ていますが、複数の列を使用できます。

SELECT  p.ID, 
        p.Patient,
        p.ProcedureType,
        p.ProcedureDate,
        [LastExamDate] = exam.ProcedureDate, 
        [DaysSinceLastExam] = DATEDIFF(DAY, exam.ProcedureDate, p.ProcedureDate),
        [LastExamType] = exam.ProcedureType 
FROM    Procedures p
        OUTER APPLY
        (   SELECT  TOP 1 exams.ProcedureType, exams.ProcedureDate
            FROM    Procedures exams
            WHERE   Exams.ProcedureType LIKE '%Exam%'
            AND     Exams.Patient = p.Patient
            AND     Exams.ProcedureDate <= p.ProcedureDate
            ORDER BY Exams.ProcedureDate DESC
        ) exam;

SQLフィドルの例

于 2013-02-15T13:40:02.753 に答える
1

これは次の方法で実行できますOUTER APPLY

SELECT  A.*, 
        B.ProcedureDate LastExamDate, 
        DATEDIFF(DAY,B.ProcedureDate,A.ProcedureDate) DaysSinceLastExam,
        B.ProcedureType
FROM Procedures A
OUTER APPLY (   SELECT TOP 1 *
                FROM Procedures
                WHERE Patient = A.Patient 
                AND ProcedureDate <= A.ProcedureDate
                AND ProcedureType LIKE 'Exam%'
                ORDER BY ProcedureDate DESC) B

これがあなたが試すためのデモです。

于 2013-02-15T13:41:23.853 に答える