如何删除同一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):
- b的开始时间早于/等于a的开始时间,且b的结束时间晚于/等于a的结束时间
- 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;
逻辑说明
- 先按
ID、Absence_reason分组,组内按Start升序、End降序排序,确保同组内的大时间段排在最前面 - 用
retain语句保留当前组的最大结束时间 - 首次进入新分组时,输出当前记录并更新
max_end - 后续记录若结束时间小于等于
max_end,说明被前面的大时间段包含,直接删除;否则更新max_end并输出
两种方法处理后,都能得到你期望的结果:只保留各组的大时间段,删除完全重叠的子时间段。
内容的提问来源于stack exchange,提问作者NewUsr
相关产品推荐
相关产品推荐

