在SAS中以3个变量为条件合并两个数据集
Merging two datasets conditional on 3 variables in SAS
我对使用 SAS 很陌生,想请您帮助合并两个不包含一个关键标识符但需要三个条件的组合才能成功合并的数据集。
我有两个数据集:
- 数据集 1 包含有关客户访问的信息,包括
StartDate
、EndDate
、EmployeeNumber
和 CustomerNumber
。
- 数据集 2 包含有关访问期间可能已执行的某些活动的信息,此外还有 "Date" 当 activity 已执行以及
EmployeeNumber
和 CustomerNumber
目标是保留第一个数据集并在第二个数据集可用时添加信息 - 基于日期、员工编号和客户编号的匹配。
重要的是,activity 数据集中的日期变量正好是一天,而在访问数据集中,它是开始日期和结束日期之间的范围。因此,数据集如下所示:
Base datasets
从逻辑上讲,应该是基于三个条件的合并:
- IF EmployeeNumber = EmployeeNumber
- IF CustomerNumber = CustomerNumber
- 如果日期介于 StartDate 和 EndDate 之间
然后:使用来自 activity 数据集 的信息更新访问数据集
所以,理想的新数据集应该是这样的:
Intended result of merge
如果 activity 数据集中没有条目,则新数据集应该只包含相应变量的空白。对于所有匹配项,它应该添加相应的变量。
在 SAS 中尝试(相当简单)合并语句时,我通常会收到一条错误消息,指出 "BY variables are not properly sorted on data set"。此外,我不确定如何正确实施条件(尤其是日期与范围的匹配)。
这种合并可以在 SAS 或 SQL 中完成吗?
非常感谢任何帮助!!!
我倾向于使用 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;
我对使用 SAS 很陌生,想请您帮助合并两个不包含一个关键标识符但需要三个条件的组合才能成功合并的数据集。
我有两个数据集:
- 数据集 1 包含有关客户访问的信息,包括
StartDate
、EndDate
、EmployeeNumber
和CustomerNumber
。 - 数据集 2 包含有关访问期间可能已执行的某些活动的信息,此外还有 "Date" 当 activity 已执行以及
EmployeeNumber
和CustomerNumber
目标是保留第一个数据集并在第二个数据集可用时添加信息 - 基于日期、员工编号和客户编号的匹配。
重要的是,activity 数据集中的日期变量正好是一天,而在访问数据集中,它是开始日期和结束日期之间的范围。因此,数据集如下所示: Base datasets
从逻辑上讲,应该是基于三个条件的合并:
- IF EmployeeNumber = EmployeeNumber
- IF CustomerNumber = CustomerNumber
- 如果日期介于 StartDate 和 EndDate 之间
然后:使用来自 activity 数据集 的信息更新访问数据集
所以,理想的新数据集应该是这样的:
Intended result of merge
如果 activity 数据集中没有条目,则新数据集应该只包含相应变量的空白。对于所有匹配项,它应该添加相应的变量。
在 SAS 中尝试(相当简单)合并语句时,我通常会收到一条错误消息,指出 "BY variables are not properly sorted on data set"。此外,我不确定如何正确实施条件(尤其是日期与范围的匹配)。
这种合并可以在 SAS 或 SQL 中完成吗?
非常感谢任何帮助!!!
我倾向于使用 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;