如何在SAS Enterprise Guide的PROC SQL中给ID标记特定列变更状态
在SAS PROC SQL中生成标记列col1的实现方案
需求说明
现有如下数据集:
| ID | val1 | val2 |
|---|---|---|
| 123 | M | M |
| 123 | M | P |
| 123 | P | P |
| 444 | PR | PR |
| 444 | PR | PR |
| 567 | PR | M |
| 567 | M | M |
| 99 | PR | P |
需要新增列col1,规则为:
- 若某一ID从未出现
val1='PR'且val2为'M'或'P'的记录,则该ID所有行的col1值为1 - 只要该ID存在符合上述条件的记录,则所有行的
col1值为0
期望输出结果:
| ID | val1 | val2 | col1 |
|---|---|---|---|
| 123 | M | M | 1 |
| 123 | M | P | 1 |
| 123 | P | P | 1 |
| 444 | PR | PR | 1 |
| 444 | PR | PR | 1 |
| 567 | PR | M | 0 |
| 567 | M | M | 0 |
| 99 | PR | P | 0 |
PROC SQL实现代码
PROC SQL; CREATE TABLE desired_result AS SELECT t1.ID, t1.val1, t1.val2, CASE WHEN t2.has_invalid = 0 THEN 1 ELSE 0 END AS col1 FROM original_table t1 LEFT JOIN ( SELECT ID, MAX(CASE WHEN val1 = 'PR' AND val2 IN ('M', 'P') THEN 1 ELSE 0 END) AS has_invalid FROM original_table GROUP BY ID ) t2 ON t1.ID = t2.ID; QUIT;
代码逻辑解释
- 子查询t2:
- 按
ID分组,对每个ID检查是否存在val1='PR'且val2为M/P的记录 - 用
MAX()函数:只要该ID有一条符合条件的记录,has_invalid就会被标记为1;若完全没有则为0
- 按
- 主查询:
- 将原表
t1与子查询结果t2通过ID关联 - 用
CASE语句转换标记:当has_invalid=0时col1=1,否则为0,完全匹配需求规则
- 将原表
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

