通过 MRN 和 date1 >= MAX(date2) 连接两个表

Join two tables by MRN and date1 >= MAX(date2)

我需要合并来自两家医院 activity 报告的数据。发生的事情是这样的:患者被送往脊柱科。然后,其中一些人被转介进行通风。过了一会儿,病人出院了。之后,同一名患者可能会或可能不会被重新转诊回脊柱科室,也可能会或可能不会被重新转诊进行通气治疗。我在两份报告中收到 activity 数据:

每月Activity报告:

[MRN] [NHS Number] [Admission Date] [DoB] [Blah] [Blah]

通风报告

[MRN] [Admission Date]  [Ventilation Days]   [Ventilation Type] [blah] [blah]

N.B。通气报告上的入院日期是他们转介进行通气的日期。这可能是同一天,也可能是他们被转诊到脊柱科之后的某个日期。

我需要实现的是:在将患者转诊至通气之前,将每一行连接到最直接的条目。我需要避免重复行,但我无法将其加入每月 Activity 报告中的最新行,因为这很容易成为后续推荐,而其他信息将不适用。

根据 Whosebug 上类似问题的答案,我想出了这段代码:

SELECT [Year], [Month], MRN, [NHS Number], [Admission Date] AS [VD 
Admission Date], 
[Admit date] AS [MAR Admit Date], Days,
[Ventilation Type], [Ventilation Route], [Ventilation Time], [Package of 
care class],
[Para/Tetra/No deficit], [Social charge date commenced ] AS [Social charge 
date], [Discharge date]
FROM Spinal_Costing.Vented_Days VD
LEFT JOIN (SELECT *, ROW_NUMBER() OVER(PARTITION BY [Patient MRN] ORDER BY 
[Admit Date] DESC) AS row
    FROM Spinal_Costing.MAR
 ) MAR ON VD.MRN = MAR.[Patient MRN]
 WHERE MAR.row = 1;

但这 returns 每个患者在 MAR 中的最新条目。

您走在正确的轨道上,您只需要向派生的 table 添加一个 JOIN 以将 Spinal_Costing.MAR table 中的行限制为那些出院时或出院前。

SELECT 
    [Year], 
    [Month], 
    MRN, 
    [NHS Number], 
    [Admission Date] AS [VD Admission Date], 
    [Admit date] AS [MAR Admit Date], 
    Days,
    [Ventilation Type], 
    [Ventilation Route], 
    [Ventilation Time], 
    [Package of care class],
    [Para/Tetra/No deficit], 
    [Social charge date commenced ] AS [Social charge date], 
    [Discharge date]
FROM 
    Spinal_Costing.Vented_Days VD
LEFT JOIN 
    (SELECT 
        *, 
        ROW_NUMBER() OVER(PARTITION BY [Patient MRN] ORDER BY [Admit Date] DESC) AS row
    FROM Spinal_Costing.MAR 
    --added the JOIN and WHERE clause here
    INNER JOIN Spinal_Costing.Vented_Days 
        ON Spinal_Costing.Vented_Days.MRN = Spinal_Costing.MAR.[Patient MRN]
    WHERE  Spinal_Costing.MAR.[Admit Date]  <= Spinal_Costing.Vented_Days.[Discharge date]
 ) MAR ON VD.MRN = MAR.[Patient MRN]
 WHERE MAR.row = 1;

这也可以通过 apply 来实现,该 apply 引用 Vented_Days 中的值,并且简单地为每一行 return 一个 top 1cross apply 不会 return null 值,而 outer apply 会:

declare @vd table(MRN int,AdmissionDate date);
declare @mar table(MRN int,AdmissionDate date);

insert into @vd values
 (1,'20190102')
,(1,'20190106')
,(2,'20190104')
,(3,'20190101');

insert into @mar values
 (1,'20190101')
,(1,'20190105')
,(2,'20190102');

select v.MRN
        ,v.AdmissionDate
        ,m.AdmissionDate
from @vd as v
    outer apply (select top 1 m.AdmissionDate
                 from @mar as m
                 where v.MRN = m.MRN
                    and v.AdmissionDate >= m.AdmissionDate
                 order by m.AdmissionDate desc
                ) as m
order by v.MRN
        ,v.AdmissionDate;

输出

+-----+---------------+---------------+
| MRN | AdmissionDate | AdmissionDate |
+-----+---------------+---------------+
|   1 | 2019-01-02    | 2019-01-01    |
|   1 | 2019-01-06    | 2019-01-05    |
|   2 | 2019-01-04    | 2019-01-02    |
|   3 | 2019-01-01    | NULL          |
+-----+---------------+---------------+