SELECT语句使用MAX函数未返回close列最高值的问题咨询
问题原因
该问题由不符合SQL标准的隐式聚合查询逻辑导致,常见于MySQL等允许非标准GROUP BY语法的数据库:
- 你使用聚合函数时的查询大概率为以下错误写法:
SELECT stockID, DATE, MAX(close) AS max_close, symbol FROM ta_stockprice JOIN ta_stock ON ta_stock.id = ta_stockprice.stockID WHERE stockid = 8648
- 标准SQL要求:使用
MAX/MIN/AVG这类聚合函数且无显式GROUP BY子句时,SELECT后仅能出现聚合函数,不能直接写未被聚合的普通字段。如果数据库开启了非标准兼容模式,允许你写普通字段,会直接从符合条件的结果集中取存储顺序排在第一位的行的对应字段值,和你计算得到的聚合结果没有任何关联。你看到的固定日期2021-07-01就是存储顺序里第一条数据的日期,和MAX/MIN/AVG的计算结果完全无关,所以不管用什么聚合函数返回的日期都一致。
正确实现方案
方案1:排序取首行(单股票查询场景最优)
按close降序排序后取第一条结果即可直接得到最大值对应的行,写法最简单:
SELECT stockID, DATE, close, symbol FROM ta_stockprice JOIN ta_stock ON ta_stock.id = ta_stockprice.stockID WHERE stockid = 8648 ORDER BY close DESC LIMIT 1;
不同数据库取首行语法略有差异:SQL Server用
TOP 1替换LIMIT 1,Oracle需要在子查询排序后加WHERE ROWNUM = 1。
方案2:关联子查询(支持多股票批量查询)
如果需要同时查询多个股票的最大close对应行,可以先通过子查询拿到每个股票的最大close值,再关联原表取完整行:
SELECT t1.stockID, t1.DATE, t1.close, t2.symbol FROM ( SELECT stockID, MAX(close) AS max_close FROM ta_stockprice GROUP BY stockID ) t_max JOIN ta_stockprice t1 ON t1.stockID = t_max.stockID AND t1.close = t_max.max_close JOIN ta_stock t2 ON t2.id = t1.stockID WHERE t1.stockid = 8648 -- 仅查单个股票时保留该条件,批量查询可删除
该方案会返回同一个股票所有close等于最大值的行,若存在多日收盘价相同且均为最大值的情况也能正确覆盖。
内容的提问来源于stack exchange,提问作者Rapid1898
相关产品推荐
相关产品推荐

