Весь ваш код - М, поэтому я не уверен, почему вы отметили это SQL. Но вот [возможно, не самое элегантное] решение SQL:
create table labs (
OrderID int not null,
EpisodeID int not null,
TransplantDate date not null,
LabDate date not null,
LabValue int not null)
insert labs
values
(111, 222, cast('5/2/2018' as date), cast('1/22/2018' as date), 23),
(112, 222, cast('5/2/2018' as date), cast('1/27/2018' as date), 15),
(113, 222, cast('5/2/2018' as date), cast('5/3/2018' as date), 14),
(114, 222, cast('5/2/2018' as date), cast('10/19/2018' as date), 12),
(115, 223, cast('1/23/2019' as date), cast('1/24/2019' as date), 20),
(116, 223, cast('1/23/2019' as date), cast('1/25/2019' as date), 25),
(117, 223, cast('1/23/2019' as date), cast('1/31/2019' as date), 29),
(118, 223, cast('1/23/2019' as date), cast('4/23/2019' as date), 30),
(119, 223, cast('1/23/2019' as date), cast('3/1/2019' as date), 35),
(120, 224, cast('7/19/2019' as date), cast('7/19/2018' as date), 5),
(121, 224, cast('7/19/2019' as date), cast('7/24/2018' as date), 13)
create table patient (
EpisodeID int not null,
PatientName varchar(128) not null,
TransplantDate date not null
)
insert patient
values
(222, 'Alphers, Ralph', cast('5/2/2018' as date)),
(223, 'Bethe, Hans', cast('1/23/2019' as date)),
(224, 'Gammow, George', cast('7/19/2019' as date))
select q.EpisodeID
, min(q.[1YrPre] ) as '1YrPre'
, min(q.[3MoPre] ) as '3MoPre'
, min(q.[1MoPre] ) as '1MoPre'
, min(q.[1DayPost]) as '1DayPost'
, min(q.[1WkPost] ) as '1WkPost'
, min(q.[1MoPost] ) as '1MoPost'
, min(q.[3MoPost] ) as '3MoPost'
, min(q.[6MoPost] ) as '6MoPost'
, min(q.[1YrPost] ) as '1YrPost'
from (
select r.OrderID
, r.EpisodeID
, case when r.[1YrPreCheck] = m.[1YrPreCheck] and m.[1YrPreCheck] <= 30 then r.LabValue end as '1YrPre'
, case when r.[3MoPreCheck] = m.[3MoPreCheck] and m.[3MoPreCheck] <= 14 then r.LabValue end as '3MoPre'
, case when r.[1MoPreCheck] = m.[1MoPreCheck] and m.[1MoPreCheck] <= 7 then r.LabValue end as '1MoPre'
, case when r.[1DayPostCheck] = m.[1DayPostCheck] and m.[1DayPostCheck] <= 1 then r.LabValue end as '1DayPost'
, case when r.[1WkPostCheck] = m.[1WkPostCheck] and m.[1WkPostCheck] <= 1 then r.LabValue end as '1WkPost'
, case when r.[1MoPostCheck] = m.[1MoPostCheck] and m.[1MoPostCheck] <= 7 then r.LabValue end as '1MoPost'
, case when r.[6MoPostCheck] = m.[3MoPostCheck] and m.[3MoPostCheck] <= 14 then r.LabValue end as '3MoPost'
, case when r.[6MoPostCheck] = m.[6MoPostCheck] and m.[6MoPostCheck] <= 30 then r.LabValue end as '6MoPost'
, case when r.[1YrPostCheck] = m.[1YrPostCheck] and m.[1YrPostCheck] <= 30 then r.LabValue end as '1YrPost'
from (
select p.EpisodeID
, min(abs(datediff(day, l.LabDate, dateadd(year, -1, p.TransplantDate)))) as '1YrPreCheck'
, min(abs(datediff(day, l.LabDate, dateadd(month, -3, p.TransplantDate)))) as '3MoPreCheck'
, min(abs(datediff(day, l.LabDate, dateadd(month, -1, p.TransplantDate)))) as '1MoPreCheck'
, min(abs(datediff(day, l.LabDate, dateadd(day, 1, p.TransplantDate)))) as '1DayPostCheck'
, min(abs(datediff(day, l.LabDate, dateadd(day, 7, p.TransplantDate)))) as '1WkPostCheck'
, min(abs(datediff(day, l.LabDate, dateadd(month, 1, p.TransplantDate)))) as '1MoPostCheck'
, min(abs(datediff(day, l.LabDate, dateadd(month, 3, p.TransplantDate)))) as '3MoPostCheck'
, min(abs(datediff(day, l.LabDate, dateadd(month, 6, p.TransplantDate)))) as '6MoPostCheck'
, min(abs(datediff(day, l.LabDate, dateadd(year, 1, p.TransplantDate)))) as '1YrPostCheck'
from labs l
inner join patient p on p.EpisodeID = l.EpisodeID
group by p.EpisodeID
) m
inner join (
select l.OrderID
, p.EpisodeID
, l.LabValue
, abs(datediff(day, l.LabDate, dateadd(year, -1, p.TransplantDate))) as '1YrPreCheck'
, abs(datediff(day, l.LabDate, dateadd(month, -3, p.TransplantDate))) as '3MoPreCheck'
, abs(datediff(day, l.LabDate, dateadd(month, -1, p.TransplantDate))) as '1MoPreCheck'
, abs(datediff(day, l.LabDate, dateadd(day, 1, p.TransplantDate))) as '1DayPostCheck'
, abs(datediff(day, l.LabDate, dateadd(day, 7, p.TransplantDate))) as '1WkPostCheck'
, abs(datediff(day, l.LabDate, dateadd(month, 1, p.TransplantDate))) as '1MoPostCheck'
, abs(datediff(day, l.LabDate, dateadd(month, 3, p.TransplantDate))) as '3MoPostCheck'
, abs(datediff(day, l.LabDate, dateadd(month, 6, p.TransplantDate))) as '6MoPostCheck'
, abs(datediff(day, l.LabDate, dateadd(year, 1, p.TransplantDate))) as '1YrPostCheck'
from labs l
inner join patient p on p.EpisodeID = l.EpisodeID
) r on r.EpisodeID = m.EpisodeID
)q
group by q.EpisodeID