MySQL中DENSE_RANK()函数语法报错问题排查求助
问题排查与修正方案
语法错误原因
你的SQL语句报错核心原因是使用了MySQL 5.x版本不支持的窗口函数DENSE_RANK() OVER()——窗口函数是MySQL 8.0及以后版本才引入的特性,若你的MySQL版本低于8.0,执行这类语句就会触发语法错误。此外,原语句中SELECT c.car_name但仅GROUP BY c.car_id,在MySQL严格SQL模式下会触发非聚合列未在GROUP BY中的错误(尽管部分宽松模式可能允许,但不符合SQL标准)。
修正方案
方案1:适用于MySQL 8.0及以上版本
保留窗口函数逻辑,同时修正GROUP BY的SQL标准兼容性问题:
SELECT c.car_name, No_of_Days, Dense_Rank FROM ( SELECT c.car_id, c.car_name, MAX(DATEDIFF(r.return_date, r.pickup_date)) + 1 AS No_of_Days, DENSE_RANK() OVER (ORDER BY MAX(DATEDIFF(r.return_date, r.pickup_date)) + 1 DESC) as Dense_Rank FROM cars AS c JOIN rentals AS r ON c.car_id = r.car_id WHERE MONTH(pickup_date) = 5 GROUP BY c.car_id, c.car_name ) AS ranked_cars WHERE Dense_Rank = 1;
说明:
- 子查询完成分组聚合和排名,外层筛选排名第1的记录,直接得到5月份租期最长的汽车名称;
- 分组时同时包含
car_id和car_name,符合SQL标准,避免严格模式下的报错。
方案2:适用于MySQL 5.x版本(不支持窗口函数)
通过子查询先找出最大租期天数,再关联查询对应汽车:
SELECT c.car_name, MAX(DATEDIFF(r.return_date, r.pickup_date)) + 1 AS No_of_Days FROM cars AS c JOIN rentals AS r ON c.car_id = r.car_id WHERE MONTH(pickup_date) = 5 GROUP BY c.car_id, c.car_name HAVING MAX(DATEDIFF(r.return_date, r.pickup_date)) + 1 = ( SELECT MAX(DATEDIFF(return_date, pickup_date)) + 1 FROM rentals WHERE MONTH(pickup_date) = 5 );
说明:
- 内层子查询计算5月份所有租车记录中的最大租期天数;
- 外层查询分组计算每辆车的最长租期,筛选出等于最大天数的记录,得到目标结果。
内容的提问来源于stack exchange,提问作者markapuram venkata khaja vinee
相关产品推荐
相关产品推荐

