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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:36:03