You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL实现同一ID下办公室就诊6个月内手术记录判定

问题与解决方案

现有数据集

Id     Visit_Date        Visit_code      
A30     15May2004         Surgery            
A30     05FEB2005         Office              
B01     07DEC2002         Office              
B01     21NOV2002         Surgery           

需求

生成包含以下字段的结果集:

  • ID:原数据集的人员ID
  • Office_Visit:标记该人员是否有办公室就诊记录(1=有,0=无)
  • SX_past_6mo:标记该人员的办公室就诊前6个月内是否有手术记录(1=有,0=无)

预期输出:

ID     Office_Visit    SX_past_6mo
A30        1              0
B01        1              1

原代码问题

你提供的Proc SQL存在多处语法和逻辑错误:

  1. 字段名不匹配:原数据集是Visit_code,代码中误用visit_type
  2. 子查询语法错误:select(visit_date where...)的写法不符合SAS SQL规范
  3. 日期计算逻辑颠倒:日期差参数顺序错误,且未正确限定手术记录在办公室就诊之前
  4. 分组后未用聚合函数:按Id分组后,直接返回行级判断结果会报错
  5. 语法不完整:缺少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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:57:33