SSMS中基于Patient_ID和Days_Since_Last_Visit的CASE语句编写求助
解决方案
针对你的需求,需要利用**窗口函数LEAD()和LAG()**关联同Patient_ID下的上下行数据,结合CASE语句完成标签标注。假设你的表中有用于确定行顺序的日期字段(比如Visit_Date,若实际字段不同请替换),以下是可行的SQL写法:
WITH PatientVisit AS ( SELECT Patient_ID, Days_Since_Last_Visit, -- 获取下一行的Days_Since_Last_Visit值 LEAD(Days_Since_Last_Visit) OVER (PARTITION BY Patient_ID ORDER BY Visit_Date) AS Next_Days, -- 获取上一行的Days_Since_Last_Visit值 LAG(Days_Since_Last_Visit) OVER (PARTITION BY Patient_ID ORDER BY Visit_Date) AS Prev_Days FROM YourTableName -- 替换为你的实际表名 ) SELECT Patient_ID, Days_Since_Last_Visit, CASE -- 当前行是NULL,下一行>0 → 标'Set' WHEN Days_Since_Last_Visit IS NULL AND Next_Days > 0 THEN 'Set' -- 当前行是NULL,下一行=0 → 标'NO' WHEN Days_Since_Last_Visit IS NULL AND Next_Days = 0 THEN 'NO' -- 上一行是NULL,当前行>0 → 标'Set' WHEN Prev_Days IS NULL AND Days_Since_Last_Visit > 0 THEN 'Set' -- 上一行是NULL,当前行=0 → 标'NO' WHEN Prev_Days IS NULL AND Days_Since_Last_Visit = 0 THEN 'NO' -- 其余情况标'No' ELSE 'No' END AS Tag FROM PatientVisit;
关键说明
PARTITION BY Patient_ID确保仅在同一患者的行内进行上下行关联ORDER BY Visit_Date必须指定行的排序逻辑,否则上下行关联会混乱(请根据业务实际替换排序字段)LEAD()取当前行的下一行值,LAG()取当前行的上一行值,通过这两个函数捕捉你需要的行间关系
内容的提问来源于stack exchange,提问作者VanilaNitroPepsi
相关产品推荐
相关产品推荐

