SAS 和 Coalesce 函数插入缺失的日期值?
SAS and Coalesce function to insert missing date values?
我有一个患者就诊日期 (PROC1_DT) 的数据集 (VISIT1),日期是 90 天前
(LOOKBACK_DT)。我已加入此 VISIT1 和另一个 table VISIT2,这样如果 PROC2_DT 落入
在 PROC1_DT 和 LOOKBACK_DT 之间,创建了新列表。
但是,我希望 VISIT1 中的所有日期都出现在最终数据集中,即使没有 PROC2_DT 介于 PROC1_DT 和 LOOKBACK_DT 之间.例如,医生 B 和患者 5 没有出现在当前最终数据集中,因为患者没有 PROC2_DT 介于 PROC1_DT 和 LOOKBACK_DT 之间。
我尝试使用 COALESE
但是,我显然没有正确使用它 and/or 需要另一种方法。
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:
如果我对任务的理解正确,您的问题是您认为使用的是 LEFT JOIN,但实际上是在执行内部联接。
这是因为您添加了 WHERE 条件,该条件以需要记录匹配的方式使用 "the left joined table" 中的列 - 这实际上是一个内部联接。
要使其成为左连接,您需要使 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
用于 PROC2_DT 日期 - 我不确定你在那里有什么计划。合并是基于行的操作,returns 来自 多个 个参数的第一个非空值,例如coalesce(b.VISIT_DT, a.PROC_DT) as some_date
它不是聚合函数,也没有其他聚合函数,因此不需要 GROUP BY 子句。
我有一个患者就诊日期 (PROC1_DT) 的数据集 (VISIT1),日期是 90 天前 (LOOKBACK_DT)。我已加入此 VISIT1 和另一个 table VISIT2,这样如果 PROC2_DT 落入 在 PROC1_DT 和 LOOKBACK_DT 之间,创建了新列表。
但是,我希望 VISIT1 中的所有日期都出现在最终数据集中,即使没有 PROC2_DT 介于 PROC1_DT 和 LOOKBACK_DT 之间.例如,医生 B 和患者 5 没有出现在当前最终数据集中,因为患者没有 PROC2_DT 介于 PROC1_DT 和 LOOKBACK_DT 之间。
我尝试使用 COALESE
但是,我显然没有正确使用它 and/or 需要另一种方法。
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:
如果我对任务的理解正确,您的问题是您认为使用的是 LEFT JOIN,但实际上是在执行内部联接。 这是因为您添加了 WHERE 条件,该条件以需要记录匹配的方式使用 "the left joined table" 中的列 - 这实际上是一个内部联接。
要使其成为左连接,您需要使 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
用于 PROC2_DT 日期 - 我不确定你在那里有什么计划。合并是基于行的操作,returns 来自 多个 个参数的第一个非空值,例如coalesce(b.VISIT_DT, a.PROC_DT) as some_date
它不是聚合函数,也没有其他聚合函数,因此不需要 GROUP BY 子句。