MySQL ROW_NUMBER()
MySQL中的ROW_NUMBER()函数用于返回分区中每一行的
顺序号。它是一种窗口功能。行号从1开始到分区中存在的行数。
要注意的是,MySQL在8.0版之前不支持ROW_NUMBER()函数,但是它们提供了
session变量,使我们可以模拟此功能。
语法
以下是在 MySQL :
ROW_NUMBER() OVER (<partition_definition> <order_definition>)
让我们用一个例子演示它。
首先,我们将使用以下语句创建一个名为"
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;
我们将得到如下输出: