如何使用SAS去除分组内连续重复记录并保留日期最新的最后一条
SAS 4GL实现分组内连续重复记录取最后一条方案
完全可以用SAS 4GL实现该需求,不需要复杂排序,核心是利用by语句的notsorted选项识别连续重复块,具体实现如下:
核心逻辑说明
之前用first./last.变量没得到正确结果,核心问题是直接按id value分组时,SAS会把同id下所有value相同的记录归为一组,不管中间是否被其他值分隔,会把不连续的同value记录错误合并。
正确思路不需要打乱原有按id + dt升序的排列(连续重复的判断本身就依赖日期顺序),只需要识别同id下连续value相同的片段(连续块),每个连续块保留最后一条即可。
实现代码
/* 直接筛选出需要保留的记录 */ data result; set example; /* notsorted选项:按数据现有顺序识别连续相同的id+value分组,不要求全局按value排序 */ by id value notsorted; /* 每个连续块的最后一条就是需要保留的记录 */ if last.value then output; run; /* 如果需要生成0/1标记列,可以用以下代码 */ data want_marked; set example; by id value notsorted; WANT_TO_SELECT = last.value; run;
结果验证
针对提供的示例数据,运行上述代码后保留的记录如下,完全匹配需求:
- id=10分组:dt=1的500(单条连续块保留)、dt=4的750(连续3条750的最后一条)、dt=5的500(和前一个500不连续,单条块保留)
- id=20分组:dt=2的150(连续2条150的最后一条)、dt=3的370(单条块保留)、dt=4的150(和前一个150不连续,单条块保留)
注:示例数据中
WANT_TO_SELECT列的赋值和文字描述的需求存在偏差,以上结果完全匹配文字说明的保留规则。
内容的提问来源于stack exchange,提问作者Dreamer
相关产品推荐
相关产品推荐

