MySQL 语法中 OVER 和 PARTITION 的语法错误

Posted

技术标签:

【中文标题】MySQL 语法中 OVER 和 PARTITION 的语法错误【英文标题】:Wrong syntax for OVER and PARTITION in MySQL syntax 【发布时间】:2020-11-18 22:18:01 【问题描述】:
SELECT Id, Price, CustomerId, ROW_NUMBER() OVER (PARTITION BY CustomerId)
FROM Orders;

我收到错误“语法错误:意外的'('(左括号)

mysql 不支持这个吗?我很确定我以前做过这个,从我在谷歌上看到的应该可以工作。

mysql -V
mysql  Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using  EditLine wrapper

【问题讨论】:

select version();获取服务器版本;您显示的只是命令行客户端版本,不一定完全相关 Ver 14.14 具有误导性。那是 mysql 客户端应用程序的版本,但 MySQL 服务器决定了它支持的 SQL 语法。客户端和服务器各有自己的版本号,它们不同步。我知道,这真的很令人困惑。 :-( 【参考方案1】:

窗口函数仅在 MySQL 8.0 中可用。

在早期版本中,您可以使用子查询 - 但是,您的代码缺少 ORDER BY 子句,这会导致排序不一致。假设您想按 id 对同一客户的订单进行排序,您可以将其表述为:

SELECT Id, Price, CustomerId, 
    (SELECT COUNT(*) FROM Orders o1 WHERE o1.CustomerId = o.CustomerId and o1.Id <= o.Id) AS rn
FROM Orders o;

【讨论】:

我没有使用 MySQL 的经验,我看到了 Ver 14.14,我认为我的版本高于 8.0。显然是另一个号码!谢谢 @Lucas:确实:您正在运行 5.7.32。 select version() 明确地为您提供该信息。

以上是关于MySQL 语法中 OVER 和 PARTITION 的语法错误的主要内容,如果未能解决你的问题,请参考以下文章

Oracle over函数

SQL - OVER 子句范围在 2 次之间

oracle的row_number()over rank()over和dense_rank()over这三种分析函数(转)

MYSQL lag() 和lead()函数使用介绍

cume_dist(),允许并列名次复制名次自动空缺,取并列后较大名次,结果如22355778……

MySQL - ROW_NUMBER() OVER()函数用法详解(分组排序)