MySQL执行row_number() over(partition by)窗口函数报语法错误怎么办
报错原因
该语法错误的核心诱因是当前运行环境的MySQL版本不支持窗口函数特性:
MySQL直到8.0版本才原生支持ROW_NUMBER()等窗口函数及OVER(partition by ...)语法,5.x及更早版本的SQL解析器无法识别窗口函数语法规则,执行到(partition by字段位置时就会抛出语法不匹配的报错。
你编写的原始SQL语法逻辑本身没有错误,在支持窗口函数的MySQL8.0+、PostgreSQL、Hive等SQL引擎中可以直接正常运行。
修复方案
根据实际数据库环境选择对应方案即可:
- 升级数据库版本
若业务条件允许,直接将MySQL升级到8.0及以上正式稳定版本,无需修改原有SQL,执行后即可得到按cat_id分组、组内按order_time倒序生成行号的预期结果。 - MySQL5.x版本兼容写法(无法升级时使用)
5.x版本无原生窗口函数支持,可以通过用户变量手动模拟row_number() over(partition by cat_id order by order_time desc)的计算逻辑,替换后的可执行SQL如下:
SELECT @row_num := IF(@current_cat = cat_id, @row_num + 1, 1) AS row_num, order_id, location FROM -- 内层子查询先按分组字段、排序规则完成排序,保证行号计算顺序正确 (SELECT order_id, cat_id, location, order_time FROM order_table ORDER BY cat_id, order_time DESC) AS sorted_data, -- 初始化计算用的用户变量 (SELECT @row_num := 0, @current_cat := NULL) AS init_vars;
注意:用变量模拟窗口函数时,排序逻辑必须放在内层子查询中,不能挪到外层,否则会因为数据读取顺序混乱导致行号计算结果错误。
内容的提问来源于stack exchange,提问作者Muniram UM
相关产品推荐
相关产品推荐

