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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:40:01