【问题标题】:SQL Server get latest value in table x before date for not distinct rows in table ySQL Server 在日期之前获取表 x 中的最新值,以获取表 y 中不同的行
【发布时间】:2013-11-24 19:46:32
【问题描述】:

我正在尝试在PatientTreatment.Startdate 之前为PatientTreatment 中的每一行获取最新的PatientData.DateValPatientData.DecVal。例如,我希望在每位患者每次治疗之前获得特定类型患者数据的最新日期和值。

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

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

【问题讨论】:

  • 给定样本输入的预期输出会很有用

标签: sql sql-server max row-number


【解决方案1】:

您可以使用窗口函数来执行此操作:

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

【讨论】:

  • 谢谢,这个脚本似乎对我有用。我需要检查我的结果,因为我得到了 371 条记录,但预期有 375 条记录。
【解决方案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

【讨论】:

    【解决方案3】:

    可能是这样的

    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
    

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      相关资源
      最近更新 更多