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

SQL查询求助:获取近一年医疗事故超2次的医生信息失败

问题出在哪?

嘿,我来帮你捋清楚这个问题~你现在遇到的核心问题是GROUP BY的使用逻辑跑偏了。当你把Malpractice_date和Malpractice_desc加到SELECT里时,GROUP BY会把每一条单独的医疗事故记录当成一个独立分组(毕竟每个事故的日期和描述都不一样),这时候每个分组的事故数量都是1,自然达不到“超过2次”的要求,所以查询就返回空结果啦。

正确的解决思路

咱们得换个方式:先找出那些近一年医疗事故超过2次的医生,再关联回原表,把这些医生的所有事故详情拉出来。给你两种常用的实现方式:

方式1:用子查询先筛医生

SELECT 
    S.STAFF_ID, 
    S.firstname, 
    S.lastname, 
    M.Malpractice_date, 
    M.Malpractice_desc
FROM 
    STAFF S
INNER JOIN 
    MALPRACTICE M ON S.STAFF_ID = M.DOCTOR_ID
WHERE 
    -- 用动态日期代替固定值,不用每年手动改
    M.Malpractice_date >= DATEADD(year, -1, GETDATE())
    AND M.DOCTOR_ID IN (
        -- 先找出近一年事故≥2次的医生ID
        SELECT DOCTOR_ID
        FROM MALPRACTICE
        WHERE Malpractice_date >= DATEADD(year, -1, GETDATE())
        GROUP BY DOCTOR_ID
        HAVING COUNT(*) > 2
    )
-- 按医生ID和事故日期排序,看起来更清晰
ORDER BY 
    S.STAFF_ID, M.Malpractice_date;

方式2:用CTE(公共表表达式)更直观

如果你的数据库支持CTE(比如SQL Server、PostgreSQL、MySQL 8+),这种写法可读性更强:

-- 先定义一个临时数据集,存符合条件的医生
WITH HighRiskDoctors AS (
    SELECT DOCTOR_ID
    FROM MALPRACTICE
    WHERE Malpractice_date >= DATEADD(year, -1, GETDATE())
    GROUP BY DOCTOR_ID
    HAVING COUNT(*) > 2
)
SELECT 
    S.STAFF_ID, 
    S.firstname, 
    S.lastname, 
    M.Malpractice_date, 
    M.Malpractice_desc
FROM 
    STAFF S
INNER JOIN 
    MALPRACTICE M ON S.STAFF_ID = M.DOCTOR_ID
-- 关联刚才筛选出的高风险医生
INNER JOIN 
    HighRiskDoctors H ON M.DOCTOR_ID = H.DOCTOR_ID
ORDER BY 
    S.STAFF_ID, M.Malpractice_date;
小细节调整
  • 如果用的是MySQL,把GETDATE()换成CURDATE(),日期计算改成DATE_SUB(CURDATE(), INTERVAL 1 YEAR)就行。
  • 用动态日期代替你写的固定'01/01/2017',这样每年都不用手动修改查询,更省心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:53:44