如何从Visit表筛选:第n次就诊DiseaseID=1且下一次就诊DiseaseID=2的PatientID
筛选连续就诊(DiseaseID=1紧跟DiseaseID=2)的患者ID
方法一:使用窗口函数(推荐,适用于支持窗口函数的数据库)
利用LEAD()窗口函数可以获取同一患者按日期排序后的下一次就诊疾病ID,直接筛选出当前就诊为1且下一次为2的患者:
SELECT DISTINCT v.PatientID FROM ( SELECT PatientID, DiseaseID, -- 按患者分组、日期排序,获取下一次就诊的DiseaseID LEAD(DiseaseID) OVER (PARTITION BY PatientID ORDER BY Date) AS NextDiseaseID FROM Visit ) v WHERE v.DiseaseID = 1 AND v.NextDiseaseID = 2;
你也可以反过来用LAG()函数,筛选当前就诊为2且上一次就诊为1的患者,结果完全一致:
SELECT DISTINCT v.PatientID FROM ( SELECT PatientID, DiseaseID, -- 按患者分组、日期排序,获取上一次就诊的DiseaseID LAG(DiseaseID) OVER (PARTITION BY PatientID ORDER BY Date) AS PrevDiseaseID FROM Visit ) v WHERE v.DiseaseID = 2 AND v.PrevDiseaseID = 1;
这两种方式能精准捕获“1紧跟2”的连续就诊场景,效率较高,支持MySQL 8.0+、PostgreSQL、SQL Server等主流数据库。
方法二:自连接(兼容不支持窗口函数的旧版本数据库)
如果你的数据库不支持窗口函数,可以通过自连接+子查询的方式,确保两次就诊之间没有其他记录:
SELECT DISTINCT v1.PatientID FROM Visit v1 JOIN Visit v2 ON v1.PatientID = v2.PatientID WHERE v1.DiseaseID = 1 AND v2.DiseaseID = 2 AND v2.Date > v1.Date -- 确保v1和v2之间没有其他就诊记录 AND NOT EXISTS ( SELECT 1 FROM Visit v3 WHERE v3.PatientID = v1.PatientID AND v3.Date > v1.Date AND v3.Date < v2.Date );
这个逻辑是:找到患者的DiseaseID=1的记录(v1)和同患者DiseaseID=2且日期更晚的记录(v2),同时保证两者之间没有其他就诊记录,以此确认是连续的两次就诊。
内容的提问来源于stack exchange,提问作者Shivam
相关产品推荐
相关产品推荐

