SQL实现同一ID下办公室就诊6个月内手术记录判定
问题与解决方案
现有数据集
Id Visit_Date Visit_code A30 15May2004 Surgery A30 05FEB2005 Office B01 07DEC2002 Office B01 21NOV2002 Surgery
需求
生成包含以下字段的结果集:
ID:原数据集的人员IDOffice_Visit:标记该人员是否有办公室就诊记录(1=有,0=无)SX_past_6mo:标记该人员的办公室就诊前6个月内是否有手术记录(1=有,0=无)
预期输出:
ID Office_Visit SX_past_6mo A30 1 0 B01 1 1
原代码问题
你提供的Proc SQL存在多处语法和逻辑错误:
- 字段名不匹配:原数据集是
Visit_code,代码中误用visit_type - 子查询语法错误:
select(visit_date where...)的写法不符合SAS SQL规范 - 日期计算逻辑颠倒:日期差参数顺序错误,且未正确限定手术记录在办公室就诊之前
- 分组后未用聚合函数:按
Id分组后,直接返回行级判断结果会报错 - 语法不完整:缺少
from子句、quit语句,嵌套case结构不完整
修正后的代码
proc sql; select Id as ID, max(case when Visit_code = "Office" then 1 else 0 end) as Office_Visit, max(case when Visit_code = "Office" then case when exists ( select 1 from have as s where s.Id = have.Id and s.Visit_code = "Surgery" and intck('month', s.Visit_Date, have.Visit_Date) between 0 and 6 ) then 1 else 0 end else 0 end) as SX_past_6mo from have /* 替换为你的实际数据集名称 */ group by Id; quit;
代码说明
- 字段对齐:统一使用原数据集的
Visit_code字段 - 存在性判断:用
exists子查询检查当前ID是否有符合时间条件的手术记录 - 日期差计算:
intck('month', 手术日期, 办公室就诊日期)计算两个日期的月份间隔,限定在0到6之间(表示手术在办公室就诊前6个月内,含当月) - 聚合处理:用
max()函数对每个ID的判断结果聚合,确保只要有一次符合条件的记录就标记为1 - 语法完整性:补充必要的
from、quit语句,修正嵌套case的结构
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

