SQL查询:如何分组查询多次预约患者及关联医师、用药信息
解决多次预约患者的SQL查询方案
方法1:先筛选多次预约的患者ID,再关联详情表
先通过子查询/CTE筛选出存在多次预约的患者ID,再关联医师、用药等表获取完整信息,避开GROUP BY对非聚合列的限制。
假设涉及表结构:
appointments:patient_id,start_dt,doctor_id(预约记录表)doctors:doctor_id,doctor_name(医师信息表)medications:patient_id,medication_name,dosage(患者用药表)
示例SQL:
-- 先筛选出有多次预约的患者ID WITH repeat_patients AS ( SELECT patient_id FROM appointments GROUP BY patient_id HAVING COUNT(DISTINCT start_dt) > 1 ) -- 关联所有表获取完整信息 SELECT rp.patient_id, d.doctor_name, m.medication_name, m.dosage, a.start_dt FROM repeat_patients rp JOIN appointments a ON rp.patient_id = a.patient_id JOIN doctors d ON a.doctor_id = d.doctor_id LEFT JOIN medications m ON rp.patient_id = m.patient_id ORDER BY rp.patient_id, a.start_dt;
方法2:用窗口函数标记多次预约的患者
通过窗口函数直接计算每个患者的预约次数,再筛选出符合条件的记录,无需GROUP BY即可保留所有所需列。
示例SQL:
SELECT patient_id, doctor_name, medication_name, dosage, start_dt FROM ( SELECT a.patient_id, d.doctor_name, m.medication_name, m.dosage, a.start_dt, -- 按患者分组计算预约总次数 COUNT(DISTINCT a.start_dt) OVER (PARTITION BY a.patient_id) AS appointment_count FROM appointments a JOIN doctors d ON a.doctor_id = d.doctor_id LEFT JOIN medications m ON a.patient_id = m.patient_id ) AS patient_details WHERE appointment_count > 1 ORDER BY patient_id, start_dt;
为什么直接GROUP BY会有问题?
GROUP BY要求SELECT中的列要么是GROUP BY分组列,要么是聚合函数结果。如果直接GROUP BY patient_id,医师姓名、用药信息这类非聚合列无法直接展示——因为一个患者可能对应多个医师或多种用药,GROUP BY会合并这些细节,导致信息丢失。上面两种方法先锁定目标患者范围,再拉取详细数据,完美避开这个限制。
内容的提问来源于stack exchange,提问作者omkargurme616
相关产品推荐
相关产品推荐

