使用SAS按ID匹配时间范围过滤数据集行的技术需求
SAS实现数据集日期范围过滤匹配
需求说明
现有两个SAS数据集:
- Dataset1包含ID、Start_Date、End_Date字段,存储每个ID对应的日期区间
- Dataset2包含ID、Date字段,存储每个ID的具体日期记录
需要针对每个ID,筛选出Dataset2中Date落在Dataset1对应ID的Start_Date与End_Date范围内的行。
示例数据
将示例数据转为SAS可运行的代码:
/* 创建Dataset1 */ data dataset1; input ID $ Start_Date : ddmmyy10. End_Date : ddmmyy10.; format Start_Date End_Date ddmmyy10.; datalines; Aaa 1/1/2023 5/1/2023 Bbb 10/1/2023 1/2/2023 Ccc 15/1/2023 27/1/2023 ; run; /* 创建Dataset2 */ data dataset2; input ID $ Date : ddmmyy10.; format Date ddmmyy10.; datalines; Aaa 4/1/2023 Aaa 10/1/2023 Bbb 1/1/2023 Bbb 15/1/2023 Bbb 31/1/2023 Ccc 10/1/2023 ; run;
实现方法
方法1:PROC SQL(直观易读,推荐)
通过内连接关联两个数据集,同时添加日期范围过滤条件:
proc sql; create table filtered_result as select d2.ID, d2.Date from dataset2 d2 inner join dataset1 d1 on d2.ID = d1.ID and d2.Date between d1.Start_Date and d1.End_Date order by d2.ID, d2.Date; quit;
方法2:DATA步合并
先对两个数据集按ID排序,再通过合并实现过滤:
/* 按ID排序,确保DATA步合并有序 */ proc sort data=dataset1; by ID; run; proc sort data=dataset2; by ID; run; /* 合并并筛选符合条件的记录 */ data filtered_result; merge dataset1 (in=d1) dataset2 (in=d2); by ID; /* 只保留来自Dataset2且日期在区间内的记录 */ if d2 and (Date between Start_Date and End_Date); run;
输出结果
运行上述代码后,filtered_result数据集的内容与期望输出一致:
ID Date Aaa 4/1/2023 Bbb 15/1/2023 Bbb 31/1/2023
内容的提问来源于stack exchange,提问作者JK1222
相关产品推荐
相关产品推荐

