【问题标题】:Merging two datasets conditional on 3 variables in SAS在 SAS 中以 3 个变量为条件合并两个数据集
【发布时间】:2016-12-19 06:35:37
【问题描述】:

我对使用 SAS 很陌生,想请你帮忙合并两个不包含一个键标识符但需要三个条件的组合才能成功合并的数据集。

我有两个数据集:

  • 数据集 1 包含有关客户访问的信息,包括 StartDateEndDateEmployeeNumberCustomerNumber
  • 数据集 2 包含有关访问期间可能已执行的某些活动的信息,以及执行活动的“日期”和EmployeeNumberCustomerNumber

目标是保留第一个数据集,并在第二个数据集可用时添加信息 - 基于日期、员工编号和客户编号的匹配。

重要的是,活动数据集中的日期变量只是一天,而在访问数据集中,它是开始日期和结束日期之间的范围。因此,数据集如下所示: Base datasets

从逻辑上讲,应该是基于三个条件的合并:

  1. IF EmployeeNumber = EmployeeNumber
  2. 如果客户编号 = 客户编号
  3. IF 日期在 StartDate 和 EndDate 之间
    然后:使用来自活动数据集的信息更新访问数据集

因此,理想的新数据集应如下所示: Intended result of merge
如果活动数据集中没有条目,则新数据集应仅包含相应变量的空白。对于所有匹配,它应该添加相应的变量。

在 SAS 中尝试(相当简单)合并语句时,我通常会收到一条错误消息,指出“BY 变量未在数据集上正确排序”。此外,我不确定如何正确实现条件(特别是日期与范围的匹配)。

这种合并可以在 SAS 或 SQL 中完成吗?
非常感谢任何帮助!!!

【问题讨论】:

    标签: merge sas conditional


    【解决方案1】:

    我倾向于将 proc sql 用于这类东西,它只是一个相对简单的连接,其中 SQL 擅长。试试这样的:

    proc sql;
    
    create table merged_data as
      select a.*, b.other_variable, b.other_variable2
      from dataset1 as a
      left join dataset2 as b 
        on a.EmployeeNumber = b.EmployeeNumber 
        and a.CustomerNumber = b.CustomerNumber
        and b.Date between a.StartDate and a.EndDate
    ;
    
    quit;
    

    【讨论】:

    • 太好了,谢谢。它似乎工作。需要做一点调整:它应该是“a.EndDate”而不是 b。仍在试图弄清楚为什么合并的数据集包含比原始数据集更多的行1。有什么想法吗?
    • 对,这是我的错字,对此感到抱歉。固定。
    • 关于多余的行:一定有重复的地方。您的数据是否针对同一员工和客户在每次客户访问中包含多个活动?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2015-11-27
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多