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
关键说明:
- 先通过CTE
patient_valid_admissions预计算出所有符合条件的患者(不对青霉素过敏)的最新非Pregnant入院日期。 - 最后通过
LEFT JOIN将预计算结果关联到主查询,确保admissions的所有记录都被保留,无符合条件记录时latest_admission_date为NULL。
内容的提问来源于stack exchange,提问作者TriggerThumb
相关产品推荐
相关产品推荐

