MariaDB查询8月最大发电量日期返回空结果的异常问题
问题根源分析
你的查询逻辑存在一个关键错误:子查询SELECT MAX(generation) FROM solar_generation是获取整个表的发电量最大值,而非8月的最大值。
- 7月查询能正常返回,是因为2023年7月的发电量最大值恰好是全表的最大值,所以
generation = 全表最大值和MONTH(timestamp)=7的条件能匹配到数据。 - 8月的发电量最大值小于全表最大值,此时
generation = 全表最大值的条件在8月数据中没有匹配项,自然返回空结果集。
修正方案
你需要将子查询的范围限定在目标月份,确保和外层查询的时间范围一致,以下是两种可行写法:
写法1:子查询添加时间过滤
直接在子查询中加入月份和年份条件,让子查询仅计算目标月份的最大值:
SELECT DATE_FORMAT(`timestamp`, '%a %d %M') AS timestamp, `generation` FROM solar_generation WHERE `generation` = ( SELECT MAX(`generation`) FROM solar_generation WHERE MONTH(timestamp)= 8 AND YEAR(timestamp) = 2023 ) AND MONTH(timestamp)= 8 AND YEAR(timestamp) = 2023;
写法2:使用窗口函数(更推荐)
如果存在多条记录同为当月最大值的情况,窗口函数可以一次性返回所有符合条件的记录,逻辑也更清晰:
SELECT formatted_timestamp, generation FROM ( SELECT DATE_FORMAT(`timestamp`, '%a %d %M') AS formatted_timestamp, `generation`, ROW_NUMBER() OVER(PARTITION BY MONTH(timestamp), YEAR(timestamp) ORDER BY `generation` DESC) AS rn FROM solar_generation WHERE MONTH(timestamp)= 8 AND YEAR(timestamp) = 2023 ) t WHERE rn = 1;
若需要返回所有当月最大值记录(比如多天发电量并列最高),将ROW_NUMBER()替换为RANK()即可。
内容的提问来源于stack exchange,提问作者northwarks
相关产品推荐
相关产品推荐

