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

如何删除同一absence_reason下的完全重叠子时间段

移除SAS数据集中完全重叠的子时间段

针对你提出的需求——保留同一ID和Absence_reason分组下的大时间段、删除完全被包含的子时间段,这里提供两种SAS实现方法:

方法1:PROC SQL 子查询法

proc sql;
    create table DB1_clean as
    select a.*
    from DB1 a
    where not exists (
        select 1
        from DB1 b
        where a.ID = b.ID
          and a.Absence_reason = b.Absence_reason
          and b.Start <= a.Start
          and b.End >= a.End
          and (b.Start < a.Start or b.End > a.End)
    );
quit;

逻辑说明

  • 逐行检查当前记录(a)是否存在同组(同一ID、同一请假原因)的其他记录(b):
    1. b的开始时间早于/等于a的开始时间,且b的结束时间晚于/等于a的结束时间
    2. b的时间段确实比a大(要么开始更早,要么结束更晚,排除完全相同的重复记录)
  • 若不存在这样的b,说明当前记录是该组的大时间段,予以保留;否则判定为子时间段,删除

方法2:DATA步排序法

proc sort data=DB1;
    by ID Absence_reason Start descending End;
run;

data DB1_clean;
    set DB1;
    by ID Absence_reason;
    retain max_end;
    if first.Absence_reason then do;
        max_end = End;
        output;
    end;
    else do;
        if End <= max_end then delete;
        else do;
            max_end = End;
            output;
        end;
    end;
run;

逻辑说明

  1. 先按ID、Absence_reason分组,组内按Start升序、End降序排序,确保同组内的大时间段排在最前面
  2. 用retain语句保留当前组的最大结束时间
  3. 首次进入新分组时,输出当前记录并更新max_end
  4. 后续记录若结束时间小于等于max_end,说明被前面的大时间段包含,直接删除;否则更新max_end并输出

两种方法处理后,都能得到你期望的结果:只保留各组的大时间段,删除完全重叠的子时间段。

内容的提问来源于stack exchange,提问作者NewUsr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:55:24