Frage

I am trying to get the latest PatientData.DateVal and PatientData.DecVal before PatientTreatment.Startdate for each row in PatientTreatment. E.g I want the latest date and value for a specific type of patientdata before each treatment for every patient.

I have used the script below. It works OK. But this script is no good for me because it gives me a list which only lists a patient once. I want to get the latest value for each treatment.

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  
        )

My table PatientData has the following columns (simplified):

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

And my table PatientTreatment has the following columns (simplified):

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

I hope you guys can help me out.

Kind regards Doggabyte

EDIT: I want a output which contains the following columns: PatientId, Startdate, LastDateValBeforeStartdate, LastDecValBeforeStartdate

War es hilfreich?

Lösung

You can use window functions to do this:

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

Andere Tipps

Similar to the windowed example above but with a 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

Maybe something like this

SELECT
    PatientTreatment.PatientId
    ,PatientTreatment.StartDate
    ,x.FK_PatientId
    ,x.DateVal
    ,x.DecVal
FROM 
PatientTreatment JOIN
 ( 
        SELECT 
            MAX(DateVal) ,PatientID,FK_PatientId,FK_ParamsettingId
        FROM 
            PatientData GROUP BY PatientID          
    )x ON
PatientTreatment.PatientId = x.FK_PatientId
WHERE x.FK_ParamSettingId = 68 AND x.DateVal < PatientTreatment.StartDat
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top