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

SQL技术求助:如何新增列显示排除特定诊断的患者最新入院日期?

解决方案

这里提供两种实现方式,都能满足你的需求:

方式一:使用窗口函数(更简洁)

SELECT 
    a.*, 
    d.specialty, 
    p.last_name,
    -- 仅计算符合条件的入院记录的最新日期,不符合则返回NULL
    MAX(CASE 
        WHEN a.diagnosis != 'Pregnant' AND p.allergies NOT LIKE '%Penicillin%' 
        THEN a.admission_date 
        END) OVER (PARTITION BY a.patient_id) AS latest_admission_date
FROM
    admissions a
LEFT JOIN
    doctors d ON a.attending_doctor_id = d.doctor_id
LEFT JOIN
    patients p ON a.patient_id = p.patient_id

关键说明:

  • 用LEFT JOIN替代原查询的JOIN,确保保留admissions表的所有记录,即使没有匹配的医生/患者信息。
  • 窗口函数MAX() OVER (PARTITION BY a.patient_id)按患者分组计算最大入院日期,CASE语句只筛选诊断非Pregnant且患者不对青霉素过敏的记录,不符合条件的记录会被排除在计算外,最终无符合条件记录时返回NULL。
  • 修正了原查询中IS NOT 'Pregnant'的错误写法:字符串等值判断应使用!=或<>,IS NOT仅用于判断NULL。

方式二:使用CTE子查询(逻辑更清晰)

WITH patient_valid_admissions AS (
    -- 先筛选出符合条件的患者及其最新入院日期
    SELECT 
        patient_id,
        MAX(admission_date) AS latest_admission_date
    FROM admissions
    WHERE diagnosis != 'Pregnant'
      AND patient_id IN (
          SELECT patient_id 
          FROM patients 
          WHERE allergies NOT LIKE '%Penicillin%'
      )
    GROUP BY patient_id
)
SELECT 
    a.*,
    d.specialty,
    p.last_name,
    pva.latest_admission_date
FROM admissions a
LEFT JOIN doctors d ON a.attending_doctor_id = d.doctor_id
LEFT JOIN patients p ON a.patient_id = p.patient_id
LEFT JOIN patient_valid_admissions pva ON a.patient_id = pva.patient_id

关键说明:

  • 先通过CTEpatient_valid_admissions预计算出所有符合条件的患者(不对青霉素过敏)的最新非Pregnant入院日期。
  • 最后通过LEFT JOIN将预计算结果关联到主查询,确保admissions的所有记录都被保留,无符合条件记录时latest_admission_date为NULL。

内容的提问来源于stack exchange,提问作者TriggerThumb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 16:40:12