统计未接受手术出院患者的SQL平均体温计算异常求助
问题根因
你编写的SQL核心问题是observation表缺失和其他业务表的关联条件,导致多表连接时产生笛卡尔积:所有符合observ_type = 'Temp'的体温观测记录,会和每一条筛选出来的患者入院记录做全量匹配,最终计算的AVG(observ_value)实际是全库所有体温观测数据的平均值,因此所有患者的平均体温完全一致。
修复方案
需要补充observation表和入院表的关联逻辑,通常observation表会存储关联的入院ID字段,用来对应单次住院的观测数据,关联后就会只统计患者本次住院期间的体温平均值。同时可以将原SQL的隐式连接改为显式JOIN提升可读性,嵌套的CONCAT也可以简化为多参数写法:
SELECT patient_id AS "患者ID", CONCAT(first_name,' ',surname) AS "患者姓名", admission_date AS "入院日期", discharge_date AS "出院日期", ROUND(AVG(observ_value),2) AS "平均体温", daily_charge AS "住院费用" FROM person INNER JOIN admission ON person.person_id = admission.patient_id INNER JOIN ward ON ward.ward_code = admission.ward_code -- 新增观测表和入院表的关联条件,确保仅统计本次住院的体温数据 INNER JOIN observation ON observation.admission_id = admission.admission_id WHERE admission.admission_id NOT IN (SELECT operation.admission_id FROM operation) AND observation.observ_type = 'Temp' AND admission.discharge_date IS NOT NULL GROUP BY patient_id, admission_date, discharge_date, daily_charge, first_name, surname ORDER BY admission_date
如果你的observation表没有存储关联入院ID,只有患者ID字段,可以将关联条件替换为observation.patient_id = person.person_id,但该写法在患者有多次住院记录时,可能会把其他住院时段的体温也纳入统计,优先使用入院ID关联更符合当前业务需求。
内容的提问来源于stack exchange,提问作者regina
相关产品推荐
相关产品推荐

