如何使用SAS按ID提取唯一非空账户邮箱?
问题:提取特定ID的唯一非空账户邮箱
需要为特定ID返回唯一的账户邮箱,部分ID对应多个邮箱但存在重复值,还包含空值,尝试用循环实现但未成功。
现有数据集 HAVE:
ID ACCOUNT_EMAIL 114 email_1@gmail.com 114 email_1@gmail.com 114 email_2@gmail.com 114 .
期望得到的数据集 WANT:
ID ACCOUNT_EMAIL 114 email_1@gmail.com 114 email_2@gmail.com
以下是尝试编写的SAS代码:
CREATE TABLE test AS SELECT DISTINCT ID ,UPPER(ACCOUNTEMAILADDRESS) AS Account_Email FROM DATABASE ;QUIT; PROC SORT DATA=test; BY ID descending Account_Email; Run; DATA test; SET test; BY ID descending Account_Email; IF last.Account_Email AND Account_Email = '' THEN dupIND = "Y"; ELSE dupIND = "N";; RUN;
解决方案
方法1:SQL一步实现(推荐)
直接通过SQL过滤空值并去重,同时可统一邮箱大小写:
CREATE TABLE WANT AS SELECT DISTINCT ID, UPPER(ACCOUNT_EMAIL) AS ACCOUNT_EMAIL /* 不需要大写可去掉UPPER */ FROM HAVE WHERE ACCOUNT_EMAIL IS NOT NULL; /* 排除空值 */ QUIT;
方法2:DATA步+PROC SORT
先过滤空值,再排序去重:
/* 第一步:过滤空值观测 */ DATA temp; SET HAVE; WHERE ACCOUNT_EMAIL IS NOT NULL; RUN; /* 第二步:按ID和邮箱排序,保留唯一组合 */ PROC SORT DATA=temp OUT=WANT NODUPKEY; BY ID ACCOUNT_EMAIL; RUN;
原代码问题说明
- 列名不匹配:原代码中使用
ACCOUNTEMAILADDRESS,但数据集实际列名为ACCOUNT_EMAIL,属于笔误; - 逻辑冗余:无需标记重复标识
dupIND,直接过滤空值后去重即可满足需求,无需额外复杂判断。
内容的提问来源于stack exchange,提问作者neatl
相关产品推荐
相关产品推荐

