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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:32:41