繁体   English   中英

proc sql join 在最接近日期的 SAS 中

[英]proc sql join in SAS that is closest to a date

如何在 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 中的第二条记录,该记录的“测试日期”与第一个数据集中的“给药日期”最接近(小于或等于)。

我想进行连接以选择数据集 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 
    )

计算两个日期之间的绝对差异,并使用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;

尝试这个:

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));

抱歉,我不知道这是否有效,因为我不在家。 我希望它能帮助你。

我想进行连接以选择数据集 B 中的第二条记录,该记录的“测试日期”与第一个数据集中的“给药日期”最接近(小于或等于)。

我建议交叉连接测试日期和剂量日期,并使用intck () 函数计算日期之间的绝对差,并保留最小值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM