我有一个患者就诊日期(PROC1_DT)的数据集(VISIT1),其日期为90天之前(LOOKBACK_DT)。我已将此VISIT1与另一个表VISIT2联接在一起,这样,如果PROC2_DT落入在PROC1_DT和LOOKBACK_DT之间,将创建新列表。
但是,即使没有PROC2_DT介于PROC1_DT和LOOKBACK_DT之间,我也希望将VISIT1中的所有日期都显示在最终数据集中。例如,医生B和患者5不会出现在当前最终数据集中,因为患者没有PROC2_DT介于PROC1_DT和LOOKBACK_DT之间。
我曾尝试使用COALESE
,但是显然我没有正确使用它和/或需要其他方法。
VISIT1
Doctor Patient LOOKBACK_DT PROC1_DT
A 1 28APR2018 27JUL2018
A 2 07MAR2018 05JUN2018
A 3 19JUN2018 17SEP2018
A 4 22MAY2018 20AUG2018
B 5 07FEB2019 08MAY2019
C 6 14JUL2018 12OCT2018
C 7 10APR2018 09JUL2018
C 8 17NOV2018 15FEB2019
proc sql;
create table final_data_set as
select distinct
a.Doctor
, a.Patient
, a.LOOKBACK_DT
, coalesce(b.viisit_dt) as PROC2_DT format=date9.
, a.PROC1_DT
from
VISIT1 a
left join
( select *
from prvdr_bene_visit
where _proc2 ge 1
) b
on a.Patient=b.Patient
where
b.VISIT_DT ge a.lookback_dt
and b.VISIT_DT lt a.PROC1_DT
group by
a.Doctor
, a.Patient
, a.PROC1_DT
, a.lookback_dt
order by
a.Doctor
, a.Patient
, a.PROC1_DT
;
quit;
FINAL_DATA_SET
Doctor Patient LOOKBACK_DT PROC2_DT PROC1_DT
A 1 28APR2018 24JUL2018 27JUL2018
A 2 07MAR2018 03JUN2018 05JUN2018
A 3 19JUN2018 07SEP2018 17SEP2018
A 4 22MAY2018 18AUG2018 20AUG2018
C 6 14JUL2018 09OCT2018 12OCT2018
C 7 10APR2018 03JUL2018 09JUL2018
C 8 17NOV2018 28DEC2018 15FEB2019
如果我正确理解任务,那么您的问题是您认为正在使用LEFT JOIN,但实际上是在进行内部联接。这是因为您添加了WHERE条件,该条件使用“左连接表”中的列,这种方式要求记录匹配-实际上是内部连接。
要使其成为左联接,您需要使WHERE中提供的条件成为JOIN条件的一部分-这就像将WHERE更改为AND一样容易:
on a.Patient=b.Patient
/* where */ and
b.VISIT_DT ge a.lookback_dt
and b.VISIT_DT lt a.PROC1_DT
coalesce
-我不确定您在那里的计划是什么。 Coalesce是基于行的操作,它从several参数返回第一个非空值,例如coalesce(b.VISIT_DT, a.PROC_DT) as some_date
这不是一个聚合函数,没有其他聚合函数,因此不需要GROUP BY子句。