4

の各行の最新PatientData.DateValおよびPatientData.DecVal前を取得しようとしています。たとえば、すべての患者の各治療の前に、特定の種類の患者データの最新の日付と値が必要です。PatientTreatment.StartdatePatientTreatment

以下のスクリプトを使用しました。それは正常に動作します。しかし、このスクリプトは、患者を 1 回だけリストするリストを提供するため、私には適していません。治療ごとに最新の値を取得したい。

SELECT
    PatientTreatment.PatientId
    ,PatientTreatment.StartDate
    ,PatientData.FK_PatientId
    ,PatientData.DateVal
    ,PatientData.DecVal
FROM 
    PatientTreatment
    ,PatientData 
WHERE 
    PatientTreatment.PatientId = PatientData.FK_PatientId 
    AND PatientData.FK_ParamSettingId = 68
    AND PatientData.DateVal = 
        ( 
            SELECT 
                MAX(DateVal) 
            FROM 
                PatientData 
            WHERE 
                PatientData.FK_PatientId = PatientTreatment.PatientId 
                AND DateVal < PatientTreatment.StartDate  
        )

私のテーブルPatientDataには次の列があります(簡略化):

---------------------------------------------------------------
| Id | FK_PatientID | FK_ParamsettingId | DateVal    | DecVal |
---------------------------------------------------------------
| 1  | 247          |  69               | 2010-09-11 | 1      |
| 2  | 514          |  68               | 2011-11-21 | 0      |
| 3  | 20291        |  69               | 2012-11-21 | 2.4    |
| 4  | 20291        |  69               | 2013-12-21 | 3      |
| 5  | 20291        |  69               | 2011-03-03 | 0      |
| 6  | 20221        |  68               | 2012-03-04 | 3      |
| 7  | 20291        |  68               | 2011-06-06 | 2      |
| 10 | 234          |  69               | 2011-03-07 | 4      |
| 11 | 444          |  69               | 2012-04-05 | 1.1    |
| 12 | 212          |  69               | 2012-12-04 | 4.2    |
| 13 | 21342        |  69               | 2011-11-03 | 5.5    |
| 14 | 223          |  69               | 2013-11-01 | 3.3    |
---------------------------------------------------------------

そして、私のテーブルPatientTreatmentには次の列があります(簡略化):

--------------------------
| PatientID | StartDate  |
--------------------------
| 247       | 2010-09-11 | 
| 514       | 2011-11-21 | 
| 20291     | 2012-11-21 |
| 201       | 2013-12-21 |
| 2291      | 2011-03-03 | 
| 221       | 2012-03-04 |
| 20291     | 2011-06-06 |
| 234       | 2011-03-07 |
| 80998     | 2012-04-05 |
| 212       | 2012-12-04 |
| 21342     | 2011-11-03 |
| 223       | 2013-11-01 |
--------------------------

皆さんが私を助けてくれることを願っています。

敬具ドガバイト

編集:次の列を含む出力が必要です:PatientId、Startdate、LastDateValBeforeStartdate、LastDecValBeforeStartdate

4

3 に答える 3

2

上記のウィンドウ化された例に似ていますが、CTE があります。

;WITH OrderedPatientData
AS
(
    SELECT PatientID,
            StartDate,
            DateVal AS LastDateValBeforeStartdate,
            DecVal AS LastDecValBeforeStartdata,
            ROW_NUMBER() OVER (Partition BY PatientID ORDER BY DateVal DESC) RowNum
    FROM PatientData PD
    INNER JOIN PatientTreatment PT
        ON PT.PatientID = PD.FK_PatientID AND PD.DateVal < PT.StartDate
    WHERE PD.FK_ParamSettingId = 68
)
SELECT PatientID, StartDate, LastDateValBeforeStartdate, LastDecValBeforeStartdata
FROM OrderedPatientData OPD
WHERE RowNum = 1
于 2013-11-12T16:16:48.593 に答える
2

ウィンドウ関数を使用してこれを行うことができます。

select
    x.PatentId,
    x.StartDate,
    x.DateVal,
    x.DecVal
from (
    select
        t.PatientId,
        t.StartDate,
        p.DateVal,
        p.DecVal,
        row_number() over (
            partition by t.patientid, t.StartDate
            order by p.DateVal Desc
        ) rn
    from
        PatientTreatment t
            inner join
        PatientData p
            on t.PatientId = p.FK_PatientId 
    where
        p.FK_ParamSettingId = 68 And
        t.StartDate > p.DateVal
    ) x
where
    x.rn = 1
于 2013-11-12T15:31:03.540 に答える