You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:01:56