Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询和修改数据 » OLAP 支持 » SQL Anywhere 中的窗口函数 » 窗口秩函数

 

RANK 函数

当与其它行中的值进行比较时,使用 RANK 函数返回当前行中值的秩。值的秩反映值在已排序的值列表中出现的位置。

当使用 RANK 函数时,会计算在窗口的 ORDER BY 子句中所指定的表达式的秩。当 ORDER BY 子句包括多个表达式时,若第一个表达式与相邻行具有相同值,则第二个及后续表达式将用于区分并列情况。NULL 值排在任何其它值的前面(在升序序列中)。

示例 1

以下查询确定数据库中三种最贵的产品。由于为窗口指定了降序排序,因此最贵产品的秩最低,也就是秩从 1 开始。

SELECT Top 3 *
       FROM ( SELECT Description, Quantity, UnitPrice,
              RANK() OVER ( ORDER BY UnitPrice DESC ) AS Rank 
              FROM Products ) AS DT
ORDER BY Rank;

此查询会返回以下结果:

Description Quantity UnitPrice Rank
1 Zipped Sweatshirt 32 24.00 1
2 Hooded Sweatshirt 39 24.00 1
3 Cotton Shorts 80 15.00 3

请注意,第 1 行和第 2 行中的 Unit Price 值相同,因此具有相同的秩。这称为并列。

使用 RANK 函数时,在出现并列之后秩值将发生跳跃。例如,第 3 行的秩已跳跃到 3 而不是 2。这一点与 DENSE_RANK 函数不同,DENSE_RANK 函数在出现并列之后不发生跳跃。请参见DENSE_RANK 函数

示例 2

以下 SQL 查询查找 Utah 的男女雇员并按薪水以降序顺序排列他们。

SELECT Surname, Salary, Sex,
     RANK() OVER ( ORDER BY Salary DESC ) "Rank"
     FROM Employees 
WHERE State IN ( 'UT' );

下表是查询的结果集:

Surname Salary Sex Rank
1 Shishov 72995.00 F 1
2 Wang 68400.00 M 2
3 Cobb 62000.00 M 3
4 Morris 61300.00 M 4
5 Diaz 54900.00 M 5
6 Driscoll 48023.69 M 6
7 Hildebrand 45829.00 F 7
8 Goggin 37900.00 M 8
9 Rebeiro 34576.00 M 9
10 Bigelow 31200.00 F 10
11 Lynch 24903.00 M 11
示例 3

您可以划分数据以提供不同的结果。使用示例 2 中的查询,您可以按性别划分数据,从而更改数据。以下示例按薪水以降序对雇员进行排位并按性别划分雇员。

SELECT Surname, Salary, Sex,
     RANK ( ) OVER ( PARTITION BY Sex
     ORDER BY Salary DESC ) "Rank"
     FROM Employees 
WHERE State IN ( 'UT' );

下表是查询的结果集:

Surname Salary Sex Rank
1 Wang 68400.00 M 1
2 Cobb 62000.00 M 2
3 Morris 61300.00 M 3
4 Diaz 54900.00 M 4
5 Driscoll 48023.69 M 5
6 Goggin 37900.00 M 6
7 Rebeiro 34576.00 M 7
8 Lynch 24903.00 M 8
9 Shishov 72995.00 F 1
10 Hildebrand 45829.00 F 2
11 Bigelow 31200.00 F 3

有关 RANK 函数语法的详细信息,请参见RANK 函数 [Ranking]