含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
相关产品推荐
相关产品推荐

