如何用PROC SQL的CASE语句跨行检查多变量条件?
PROC SQL实现同ID跨记录的条件判断
你可以通过关联子查询或者窗口函数实现需求,无需拆分表,直接在单条SELECT语句中完成逻辑判断:
方案1:关联子查询
利用EXISTS子查询检查同ID下是否存在符合条件的type=A记录:
PROC SQL; SELECT t.ID, t.year, t.type, CASE WHEN t.type = 'B' AND t.year = 2024 AND EXISTS ( SELECT 1 FROM your_table AS sub WHERE sub.ID = t.ID AND sub.type = 'A' AND sub.year <= 2024 ) THEN 'TRUE' ELSE 'FALSE' END AS result FROM your_table AS t; QUIT;
逻辑说明:
- 先判断当前记录是否为
type='B'且year=2024 - 通过关联子查询,校验同ID下是否存在
type='A'且year≤2024的记录 - 两个条件同时满足时返回
TRUE,否则返回FALSE
方案2:窗口函数
通过窗口函数提前计算每个ID下type=A的最大年份,再进行判断:
PROC SQL; SELECT ID, year, type, CASE WHEN type = 'B' AND year = 2024 AND MAX(CASE WHEN type = 'A' THEN year ELSE . END) OVER(PARTITION BY ID) <= 2024 THEN 'TRUE' ELSE 'FALSE' END AS result FROM your_table; QUIT;
逻辑说明:
MAX(CASE WHEN type='A' THEN year ELSE . END) OVER(PARTITION BY ID):按ID分组,计算该组内所有type=A记录的最大年份(无type=A记录时返回缺失值)- 结合当前记录的
type='B'且year=2024条件,若最大年份≤2024则返回TRUE,否则返回FALSE
针对你的样本数据,两种方案都会返回TRUE,因为ID=1下存在type=A的2023年记录,且有符合条件的type=B/2024记录。
内容的提问来源于stack exchange,提问作者SAS Newbie
相关产品推荐
相关产品推荐

