📜  MySQL ROW_NUMBER()

📅  最后修改于: 2020-11-19 00:54:53             🧑  作者: Mango

MySQL ROW_NUMBER()函数

MySQL中的ROW_NUMBER()函数用于返回分区中每一行的顺序号。它是一种窗口函数。行号从1开始到分区中存在的行数。

请注意,MySQL在8.0版之前不支持ROW_NUMBER()函数,但是它们提供了一个会话变量,该变量允许我们模拟该函数。

句法

以下是在MySQL中使用ROW_NUMBER()的基本语法:

ROW_NUMBER() OVER ( )

让我们用一个例子来演示它。

首先,我们将使用以下语句创建一个名为“ Person”的表:

CREATE TABLE Person (
  Name varchar(45) NOT NULL,
  Product varchar(45) DEFAULT NULL,
  Country varchar(25) DEFAULT NULL,
  Year int NOT NULL
);

接下来,需要向该表中添加值。执行以下语句:

INSERT INTO Person(Name, Product, Country, Year) 
VALUES ('Stephen', 'Computer', 'USA', 2015), 
('Joseph', 'Laptop', 'India', 2016), 
('John', 'TV', 'USA', 2016),
('Donald', 'Laptop', 'England', 2015),
('Joseph', 'Mobile', 'India', 2015),
('Peter', 'Mouse', 'England', 2016);

接下来,执行SELECT语句以显示记录:

mysql> SELECT * FROM Person;

我们将获得输出,如下所示:

现在,我们可以使用ROW_NUMBER()函数通过以下语句为每条记录分配一个序列号:

SELECT *, 
    ROW_NUMBER() OVER(PARTITION BY Year) AS row_num
FROM Person;

它将给出以下输出:

同样,我们可以使用ROW_NUMBER()函数使用以下语句为分区中的每个记录分配序列号:

SELECT *, 
    ROW_NUMBER() OVER(PARTITION BY Year) AS row_num
FROM Person;

它将给出以下输出,其中基于年份(2015和2016)找到了两个分区。

MySQL ROW_NUMBER()使用会话变量

我们可以模拟ROW_NUMBER()函数,以使用会话变量按递增顺序添加行号。

执行以下语句,为每行添加行号,从1开始:

SET @row_number = 0; 

SELECT Name, Product, Year, Country,
    (@row_number:=@row_number + 1) AS row_num
FROM Person ORDER BY Country;

在此语句中,我们首先指定由@prfix指示的会话变量@row_number并将其值设置为0。然后,从表Person中选择数据,并将变量@row_number的值每行增加一个。

成功执行查询后,我们将获得以下输出:

同样,我们将使用会话变量作为表,并使用以下语句将其与源表交叉连接:

SELECT (@row_number:=@row_number + 1) AS row_num, Name, Country, Year
FROM Person, (SELECT @row_number:=0) AS temp ORDER BY Year;

我们将得到如下输出: