当与其它行中的值进行比较时,使用 RANK 函数返回当前行中值的秩。值的秩反映值在已排序的值列表中出现的位置。
当使用 RANK 函数时,会计算在窗口的 ORDER BY 子句中所指定的表达式的秩。当 ORDER BY 子句包括多个表达式时,若第一个表达式与相邻行具有相同值,则第二个及后续表达式将用于区分并列情况。NULL 值排在任何其它值的前面(在升序序列中)。
以下查询确定数据库中三种最贵的产品。由于为窗口指定了降序排序,因此最贵产品的秩最低,也就是秩从 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 函数在出现并列之后不发生跳跃。
以下 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 |
您可以划分数据以提供不同的结果。使用示例 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 |
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |