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

含GROUP BY和HAVING子句的SQL查询返回空结果的解决方法

解决分组查询最大check_date对应数据的问题

原查询返回空的原因是:GROUP BY osn.id后,check_date会取分组内任意一条记录的值,而非最大值,因此having check_date=max(check_date)无法匹配到有效结果。

以下是两种可行的解决方案:

方案一:子查询预获取最大日期

先通过子查询统计每个osn_id对应的最大check_date,再关联原表获取完整数据:

SELECT 
    osn.decimal_num, 
    osn.eri, 
    oc.check_date, 
    CONCAT(
        DATE_FORMAT(oc.check_date, '%d.%m.%Y'), 
        ' - ', 
        DATE_FORMAT(DATE_ADD(oc.check_date, INTERVAL 1 YEAR), '%d.%m.%Y')
    ) AS date_range
FROM osn
JOIN osn_check oc ON osn.id = oc.osn_id
JOIN (
    SELECT osn_id, MAX(check_date) AS max_date
    FROM osn_check
    GROUP BY osn_id
) oc_max ON oc.osn_id = oc_max.osn_id AND oc.check_date = oc_max.max_date;

方案二:使用窗口函数(MySQL 8.0+ 支持)

利用ROW_NUMBER()窗口函数对每个osn.id分组内的记录按check_date降序排序,筛选出行号为1的最大日期记录:

SELECT 
    decimal_num, 
    eri, 
    check_date, 
    CONCAT(
        DATE_FORMAT(check_date, '%d.%m.%Y'), 
        ' - ', 
        DATE_FORMAT(DATE_ADD(check_date, INTERVAL 1 YEAR), '%d.%m.%Y')
    ) AS date_range
FROM (
    SELECT 
        osn.decimal_num, 
        osn.eri, 
        oc.check_date,
        ROW_NUMBER() OVER (PARTITION BY osn.id ORDER BY oc.check_date DESC) AS rn
    FROM osn
    JOIN osn_check oc ON osn.id = oc.osn_id
) t
WHERE rn = 1;

两种方案均可得到期望结果:

AD2S80AUD | AD2S80AUD | 2023-05-24 | 24.05.2023 - 24.05.2024

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:09:59