SAS新手求助:合并数据集、更新日期值及按Role跨年度汇总Hours
SAS跨年度连续记录汇总方案
针对你的需求,以下是精准匹配要求的SAS实现代码,包含详细逻辑注释:
1. 合并并排序年度数据集
先将四个年度数据集合并,添加来源年份字段用于跨年度判断,再按ID和起始日期排序,保证处理顺序正确:
/* 合并四个年度数据集,添加来源年份字段 */ data combined; set Year_2013 Year_2014 Year_2015 Year_2016; source_year = year(Start); run; /* 按ID和Start日期排序,确保同ID记录按时间顺序排列 */ proc sort data=combined; by ID Start; run;
2. 处理跨年度记录的汇总与Role变更标记
使用BY GROUP和RETAIN语句实现核心逻辑,严格遵循"仅跨年度同Role汇总、单年度不合并、Role变更标记"的要求:
data Years_all; set combined; by ID; /* 保留累计所需的中间变量 */ retain prev_Role sum_Hours group_Start group_End; /* 定义Role变更标记字段 */ length role_change $1; /* 初始化每个ID的第一组记录 */ if first.ID then do; prev_Role = Role; sum_Hours = Hours; group_Start = Start; group_End = End; role_change = 'N'; return; end; /* 判断是否为跨年度且同Role的连续记录 */ if Role = prev_Role and year(Start) = year(group_End) + 1 then do; /* 累计工时,更新组结束日期 */ sum_Hours = sum_Hours + Hours; group_End = End; role_change = 'N'; end; else do; /* 输出上一组汇总后的记录 */ Start = group_Start; End = group_End; Role = prev_Role; Hours = sum_Hours; output; /* 标记Role变更(不同则设为Y) */ role_change = ifc(Role ne prev_Role, 'Y', 'N'); /* 重置当前组的变量 */ prev_Role = Role; sum_Hours = Hours; group_Start = Start; group_End = End; end; /* 输出每个ID的最后一组记录 */ if last.ID then do; Start = group_Start; End = group_End; Role = prev_Role; Hours = sum_Hours; output; end; /* 删除不需要的中间变量 */ drop prev_Role sum_Hours group_Start group_End source_year; run;
核心逻辑说明
- 禁止单年度汇总:通过
year(Start) = year(group_End) + 1判断,仅当当前记录的起始年份是上一组结束年份的下一年时,才会触发汇总,单年度内的多条记录会原样保留 - 跨年度同Role汇总:同ID下连续年度的同Role记录,会累计
Hours,并将End日期更新为该组最后一条记录的结束日期(如你提到的ID 0004,90+69汇总后End为31DEC2015) - Role变更标记:当当前记录的Role与上一组不同时,
role_change字段会被设为Y,方便后续筛选变更记录
内容的提问来源于stack exchange,提问作者Bfu38
相关产品推荐
相关产品推荐

