通过 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 1
。 cross 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 |
+-----+---------------+---------------+
我需要合并来自两家医院 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 1
。 cross 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 |
+-----+---------------+---------------+