【问题标题】:proc sql join in SAS that is closest to a dateproc sql加入SAS中最接近日期
【发布时间】: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 中的第二条记录,该记录的“测试日期”与第一个数据集中的“给药日期”最接近(小于或等于)。

【问题讨论】:

    标签: sql date join sas proc


    【解决方案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() 函数计算日期之间的绝对差,并保留最小值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多