Соедините две таблицы по MRN и date1> = MAX (date2) - PullRequest
0 голосов
/ 17 января 2019

Мне нужно объединить данные из двух отчетов о деятельности больницы. Вот что происходит: пациенты поступают в отдел позвоночника. Некоторые из которых затем получают ссылку на вентиляцию. Через некоторое время пациент выписан. Позже, тот же самый пациент может или не может быть повторно направлен назад в отдел позвоночника и может или не может быть повторно направлен для вентиляции. Мне отправляют данные о деятельности в двух отчетах:

Ежемесячный отчет о деятельности:

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

Отчет о вентиляции

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

N.B. Дата поступления в отчете о вентиляции - это дата, когда они направляются на вентиляцию. Это может быть тот же день или некоторая дата после того, как они были переданы в отдел позвоночника.

Что мне нужно сделать, так это: присоединить каждый ряд к самому непосредственному входу до направления пациента на вентиляцию. Мне нужно избегать дублирования строк, но я не могу присоединить его к самой последней строке в Ежемесячном отчете об активности, поскольку это может быть последующим переходом, а другая информация неприменима.

Получив ответ на аналогичный вопрос о Stackoverflow, я получил следующий код:

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;

Но это возвращает самую последнюю запись в MAR для каждого пациента.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Этого также можно добиться с помощью apply, который ссылается на значения в Vented_Days и просто возвращает top 1 для каждой строки. cross apply не вернет 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          |
+-----+---------------+---------------+
0 голосов
/ 17 января 2019

Вы были на правильном пути, вам просто нужно добавить JOIN к этой производной таблице, чтобы ограничить строки в таблице Spinal_Costing.MAR теми, которые были в или до выгрузки.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...