proc sql加入SAS中最接近日期
Posted
技术标签:
【中文标题】proc sql加入SAS中最接近日期【英文标题】:proc sql join in SAS that is closest to a date 【发布时间】:2020-06-12 21:38:53 【问题描述】:如何在 SAS 中使用 proc sql 在两个数据集之间进行一对多连接,以获取数据集 B 中的记录最接近数据集 A 中的值?
数据集 A
#Patient #Date of Dose
001 2020-02-01
数据集 B
# Patient # Lab Test #Date of Test # Value
001 Test 1 2020-01-17 6
001 Test 1 2020-01-29 10
我想进行连接以选择数据集 B 中的第二条记录,该记录的“测试日期”与第一个数据集中的“给药日期”最接近(小于或等于)。
【问题讨论】:
【参考方案1】:我想进行连接以选择数据集 B [...] 中的 [..] 记录,其“测试日期”与“给药日期”最接近(小于或等于)在第一个数据集中。
您可以使用 outer appy
- 如果 sas 支持:
select a.*, b.*
from a
outer apply(
select top 1 b.*
from b
where b.patient = a.patient and b.date_of_test <= a.date_of_dose
order by b.date_of_test desc
) b
另一种解决方案是加入 not exists
条件:
select a.*, b.*
from a
left join b
on b.patient = a.patient
and b.date_of_test <= a.date_of_dose
and not exists (
select 1
from b b1
where
b1.patient = a.patient
and b1.date_of_test <= a.date_of_dose
and b1.date_of_test > b.date_of_test
)
【讨论】:
【参考方案2】:计算两个日期之间的绝对差,并使用having
子句选择最小日期。您需要执行额外的逻辑,例如 distinct
,以删除所有重复项。
proc sql noprint;
select t1.patient
, t1.date_of_dose
, abs(t1.date - t2.date) as date_dif
from dataset_A as t1
LEFT JOIN
dataset_B as t2
ON t1.patient = t2.patient
where t1.date <= t2.date
group by t1.patient
having calculated date_dif = min(calculated date_dif)
;
quit;
【讨论】:
【参考方案3】:试试这个:
SELECT TOP 1 *
FROM (
SELECT DSA.Patient
,DSA.Date_Of_Dose
,DSB.Date_Of_Test
,DATEDIFF(Day, DSA.Date_Of_Dose, DSA.Date_Of_Dose) Diff
FROM DataSetA DSA
JOIN DataSetB DSB ON DSA.Patient = DSB.Patient
) Data
WHERE ABS(Diff) = MIN(ABS(Diff));
抱歉,我不知道这是否有效,因为我不在家。希望对你有帮助。
【讨论】:
【参考方案4】:我想进行连接以选择数据集 B 中的第二条记录,该记录的“测试日期”与第一个数据集中的“给药日期”最接近(小于或等于)。
我建议交叉加入测试日期和剂量日期,并使用 intck() 函数计算日期之间的绝对差,并保留最小值。
【讨论】:
以上是关于proc sql加入SAS中最接近日期的主要内容,如果未能解决你的问题,请参考以下文章