如何用SAS判断用户的Acct_ID是否存在历史交易记录
需求说明:判断数据集中的Acct_ID是否曾被使用过
字段定义
- Primary_ID:用户唯一标识(每个用户仅拥有一个Primary_ID,所有账户均归属于该标识)
- Acct_ID:账户唯一标识
- Transaction_DT:交易发生日期
具体问题
如何判断用户在某笔交易对应的Acct_ID上是否有过往交易?例如:Primary_ID=001在07OCT2022有Acct_ID=101的交易,此前该用户于05JAN2020使用过该账户;Primary_ID=002的情况类似。需通过SAS实现该判断,寻求技术协助。
数据集示例
| Primary_ID | Acct_ID | Transaction_DT |
|---|---|---|
| 001 | 101 | 05JAN2020 |
| 001 | 100 | 10MAY2021 |
| 001 | 103 | 15MAY2021 |
| 001 | 101 | 07OCT2022 |
| 002 | 110 | 23SEP2021 |
| 002 | 111 | 20DEC2021 |
| 002 | 110 | 03OCT2022 |
SAS实现方案
方法1:排序后利用分组标记
先按用户、账户、交易日期排序,再通过分组逻辑直接标记是否为首次交易:
/* 排序:确保同一用户同一账户的交易按时间顺序排列 */ PROC SORT DATA=original_data; BY Primary_ID Acct_ID Transaction_DT; RUN; /* 标记是否有过往交易 */ DATA result_data; SET original_data; BY Primary_ID Acct_ID; /* FIRST.Acct_ID为1时,是该用户该账户的第一笔交易,无过往记录 */ has_prior_transaction = NOT FIRST.Acct_ID; RUN;
方法2:SQL分组计算首次交易日期对比
通过分组获取每个用户每个账户的首次交易日期,再与当前交易日期对比:
PROC SQL; CREATE TABLE result_data AS SELECT t.*, CASE WHEN t.Transaction_DT > g.first_dt THEN 1 ELSE 0 END AS has_prior_transaction FROM original_data t LEFT JOIN ( SELECT Primary_ID, Acct_ID, MIN(Transaction_DT) AS first_dt FROM original_data GROUP BY Primary_ID, Acct_ID ) g ON t.Primary_ID = g.Primary_ID AND t.Acct_ID = g.Acct_ID; QUIT;
结果说明
处理后的数据集新增has_prior_transaction字段:
- 0:该交易是该用户该账户的首次交易,无过往记录
- 1:该交易之前,该用户已使用过此账户
内容的提问来源于stack exchange,提问作者NewbieCode
相关产品推荐
相关产品推荐

