在 MariaDB 中使用 ROW_NUMBER() 函数的问题

Posted

技术标签:

【中文标题】在 MariaDB 中使用 ROW_NUMBER() 函数的问题【英文标题】:Problem Using ROW_NUMBER() function in MariaDB 【发布时间】:2019-09-03 05:48:14 【问题描述】:

我想在选择表输出中有一个行号列,但是当我尝试使用 ROW_NUMBER() 函数时,MariaDB 会引发语法错误。网上有几个参考资料(http://www.mysqltutorial.org/mysql-window-functions/mysql-row_number-function/),但到目前为止我还没有成功。这是我的 MariaDB 表的一部分:

+---------------------+------------+  
| date_reading        | temp_patio |
|---------------------+------------+  
| 2019-09-03 06:26:00 |       17.6 |  
| 2019-09-03 06:33:00 |       17.5 |  
| 2019-09-03 06:40:00 |       17.5 |  
| 2019-09-03 06:46:00 |       17.5 |  
| 2019-09-03 06:53:00 |       17.4 |  
| 2019-09-03 07:00:00 |       17.4 |  
| 2019-09-03 07:07:00 |       17.4 |  
| 2019-09-03 07:13:00 |       17.4 |

文档说“OVER ()” 选项的选项是可选的,但我尝试了使用和不使用 OVER () 子句以及使用 and没有 ORDER BY 子句。

这是我的选择命令:

选择 ROW_NUMBER() OVER ( ) 作为 Therow,* from MyData where Date_Reading > Now()- INTERVAL 3 HOUR;

我也尝试过不使用OVER () 子句并使用OVER ( ORDER BY ID)

我的 MariaDB 版本是

服务器版本:10.1.38-MariaDB-0+deb9u1 Raspbian 9.0

有人可以帮忙吗?...RDK

【问题讨论】:

根据ROW_NUMBER 的MariaDB 官方文档,它是only supported on 10.2 versions and later。所以,你的版本甚至可能不支持ROW_NUMBER 你的 maria db 版本是什么 好的,看来我需要更新了。这很令人惊讶,因为我大约一周前才通过普通的“sudo apt-get install mariadb-server”将它安装在这个 Raspberry Pi 上。他们的图书馆可能落后了?将 10.2 安装到这个 Pi 上的正确过程是什么?而且,使用“新”版本是否有问题? 【参考方案1】:

Window functions 仅在 MariaDB 10.2 或更高版本中受支持。

MariaDB 10.2 或更高版本:

SELECT 
    MyData.*,
    ROW_NUMBER() OVER ( ORDER BY ID ) as Therow
FROM MyData 
WHERE Date_Reading > Now()- INTERVAL 3 HOUR;

低版本:

我们可以使用MySQL variable 来完成这项工作。

SELECT 
    MyData.*, 
    @row_num:= @row_num + 1 AS Therow
FROM 
    MyData, 
    (SELECT @row_num:= 0 AS num) AS c
WHERE Date_Reading > Now()- INTERVAL 3 HOUR
ORDER BY test.`date` ASC;

【讨论】:

谢谢,直到我得到升级版,它就像一个魅力 请注意,如果您按两列排序,@row_num 的这个技巧可能不起作用。 如何在我的表中创建列,使其在我的数据库表中而不是输出? 为此输出选择 PK 和 row_number 并使用 PK(primarykey) 再次加入同一个表并使用更新语句

以上是关于在 MariaDB 中使用 ROW_NUMBER() 函数的问题的主要内容,如果未能解决你的问题,请参考以下文章

MariaDB ROW_NUMBER 与 ORDER BY 未正确排序

在 MariaDB 中,如何从表中选择前 10 行?

如何在此查询中使用 ROW_NUMBER? [关闭]

如何在 Hibernate 中使用 row_number 函数编写查询?

在 db2 中使用 row_number()

在禁用分区功能的 SQL 中使用分区上的 Row_number