SAS基于两列与日期获取唯一数据:识别客人首次切换度假村的入住记录
解决方案
核心逻辑
数据已经按ID、入住日期排序,只需按ID分组找到首次出现度假村变化的位置,保留对应两条记录即可,仅入住过单家度假村的客人会被自动过滤。
实现代码
方法1:Data步(新手易理解,性能最优)
/* 步骤1:标记每个ID的首家居留地、首次切换位置 */ data temp; set have; by ID; retain first_resort switch_seq .; if first.ID then do; first_resort = Resort; switch_seq = .; seq = 1; end; else seq + 1; /* 找到首次切换到其他度假村的行号 */ if Resort ne first_resort and switch_seq = . then switch_seq = seq; /* 存储当前ID的首次切换行号到所有行 */ retain target_seq; if last.ID then target_seq = switch_seq; run; /* 步骤2:筛选需要的记录 */ data want; set temp; /* 如果需要保留切换前最近的同度假村记录,把下面的seq=1改成seq=target_seq-1 */ if seq = 1 or seq = target_seq then output; keep ID Resort Admission_Date Leave_Date; run;
上述代码默认输出每个ID首次入住的记录+首次切换到其他度假村的记录,和你提供的预期输出完全匹配。如果需要输出切换动作的紧前紧后记录,只需修改筛选条件为
seq in (target_seq-1, target_seq)即可。
方法2:Proc SQL 实现
proc sql; /* 取每个ID的首次入住记录 */ create table first_stay as select * from have group by ID having Admission_Date = min(Admission_Date); /* 取每个ID首次入住其他度假村的记录 */ create table first_switch as select a.* from have a left join (select ID, Resort as first_resort from first_stay) b on a.ID = b.ID where a.Resort ne b.first_resort group by a.ID having a.Admission_Date = min(a.Admission_Date); /* 合并结果排序 */ create table want as select * from first_stay outer union corresponding select * from first_switch order by ID, Admission_Date; quit;
内容的提问来源于stack exchange,提问作者Student
相关产品推荐
相关产品推荐

