4

我正在PatientData.DateVal尝试获取PatientData.DecVal. 例如,我想要每个患者每次治疗前特定类型的患者数据的最新日期和值。PatientTreatment.StartdatePatientTreatment

我使用了下面的脚本。它工作正常。但是这个脚本对我没有好处,因为它给了我一个只列出一次病人的列表。我想获得每种治疗的最新值。

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

我希望你们能帮助我。

亲切的问候 Doggabyte

编辑:我想要一个包含以下列的输出:PatientId、Startdate、LastDateValBeforeStartdate、LastDecValBeforeStartdate

4

3 回答 3

2

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
于 2013-11-12T15:31:03.540 回答
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 回答
0

也许是这样的

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
于 2013-11-12T15:28:40.337 回答