Skip to main content

SQLite秩()

SQLite RANK()函数简介

函数是一个窗口函数,它为查询结果集中的每一行分配一个秩。一行的秩由一加上它前面的秩数计算。

下面显示了RANK()函数的语法:

RANK() OVER (
PARTITION BY <expression1>[{,<expression2>...}]
ORDER BY <expression1> [ASC|DESC], [{,<expression1>...}]
)

在这种语法中:

相同的列值将获得相同的列。当多行具有相同的秩时,下一行的秩不是连续的。这就像奥运奖牌,如果两名运动员分享金牌,就不会有银牌。

SQLite RANK()插图

首先,创建一个名为RankDemo的新表,该表有一列:

CREATE TABLE RankDemo (
Val TEXT
);

其次,在RankDemo表中插入一些行:

INSERT INTO RankDemo(Val)
VALUES('A'),('B'),('C'),('C'),('D'),('D'),('E');

第三,从RankDemo表中查询数据:

SELECT 
*
FROM
RankDemo;

SQLite RANK Sample Table

第四,使用RANK()函数为RankDemo表的结果集中的行分配秩:

SELECT
Val,
RANK () OVER (
ORDER BY Val
) ValRank
FROM
RankDemo;

以下是输出:

SQLite RANK example

从输出中可以清楚地看到,第三行和第四行接收相同的秩,因为它们具有相同的值。第五行获得秩5,因为rank()函数跳过秩4。

SQLite RANK()函数示例

为了演示RANK()函数,我们将使用示例数据库中的tracks表。

在ORDER BY子句示例中使用SQLite RANK()函数

下面的语句使用RANK()函数按轨迹的长度排列轨迹:

SELECT
Name,
Milliseconds,
RANK () OVER (
ORDER BY Milliseconds DESC
) LengthRank
FROM
tracks

在本例中,我们跳过了PARTITION BY子句,因此,RANK()函数将整个结果集视为单个分区。

首先,ORDER BY子句根据轨迹的长度(毫秒列)对轨迹进行排序。

其次,将RANK()函数应用于结果集中的每一行,并根据轨迹的长度考虑轨迹的顺序。

通过示例使用带分区的SQLite RANK()函数

下面的语句使用RANK()函数为每个相册中的每个曲目分配一个等级:

SELECT
Name,
Milliseconds,
AlbumId,
RANK () OVER (
PARTITION BY AlbumId
ORDER BY Milliseconds DESC
) LengthRank
FROM
tracks;

下图显示了部分输出:

SQLite RANK with PARTITION BY example

在本例中:

通过使用以下子查询,可以找到每个专辑中第二长的曲目:

SELECT 
*
FROM (
SELECT
Name,
Milliseconds,
AlbumId,
RANK () OVER (
PARTITION BY AlbumId
ORDER BY Milliseconds DESC
) LengthRank
FROM
tracks
)
WHERE
LengthRank = 2;

结果如下:

SQLite RANK - Finds nth highest per group

在本教程中,您学习了如何使用SQLite RANK()函数为结果集中的每一行指定一个秩。