- 类别:
:doc:`/sql-reference/functions-analytic`(排名相关、窗口框架)
RANK¶
返回一组有序值中某个值的排名。
排名值从 1 开始,并按顺序继续增加。
如果两个值相同,则它们具有相同的排名。
语法¶
RANK() OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] [ <window_frame> ] )
有关 window_frame
语法的详细信息,请参阅 窗口框架语法和用法。
实参¶
无。
函数本身不接受任何实参,因为它返回窗口中当前行的排名(相对位置),该行按 <expr2>
排序。窗口的顺序决定了排名,因此无需向 RANK 函数传递额外的参数。
使用说明¶
expr1
是用于对窗口进行分区的列或表达式。例如,假设在每个州或省内,您想按农民的玉米产量对他们进行排名。在这种情况下,您可以按州进行分区。
如果您只需要一个群体(例如,您想对美国的所有农民进行排名,无论他们居住在哪个州),那么就省略
PARTITION BY
子句。expr2
是用于排序(排名)的列或表达式。例如,如果您对农民进行排名,看看谁的玉米产量(在他们所在的州内)更多,则应该使用
bushels_produced
列。有关详细信息,请参阅 示例 (本主题内容)。平局值导致相同的排名值;但是,序列中的间隙是由平局值引起的。
例如,如果前三行返回
1
,RANK 会跳过2
和3
并将4
分配给组中的下一行。为避免出现间隙,请改用 DENSE_RANK 函数。
示例¶
创建表和数据:
-- Create table and load data. create or replace table corn_production (farmer_ID INTEGER, state varchar, bushels float); insert into corn_production (farmer_ID, state, bushels) values (1, 'Iowa', 100), (2, 'Iowa', 110), (3, 'Kansas', 120), (4, 'Kansas', 130);
按降序显示农民的玉米产量,以及每个农民的产量排名(最高 = 1
):
SELECT state, bushels, RANK() OVER (ORDER BY bushels DESC), DENSE_RANK() OVER (ORDER BY bushels DESC) FROM corn_production; +--------+---------+-------------------------------------+-------------------------------------------+ | STATE | BUSHELS | RANK() OVER (ORDER BY BUSHELS DESC) | DENSE_RANK() OVER (ORDER BY BUSHELS DESC) | |--------+---------+-------------------------------------+-------------------------------------------| | Kansas | 130 | 1 | 1 | | Kansas | 120 | 2 | 2 | | Iowa | 110 | 3 | 3 | | Iowa | 100 | 4 | 4 | +--------+---------+-------------------------------------+-------------------------------------------+
在每个州内,按降序显示农民的玉米产量,以及每个农民的产量排名(最高 = 1
):
SELECT state, bushels, RANK() OVER (PARTITION BY state ORDER BY bushels DESC), DENSE_RANK() OVER (PARTITION BY state ORDER BY bushels DESC) FROM corn_production; +--------+---------+--------------------------------------------------------+--------------------------------------------------------------+ | STATE | BUSHELS | RANK() OVER (PARTITION BY STATE ORDER BY BUSHELS DESC) | DENSE_RANK() OVER (PARTITION BY STATE ORDER BY BUSHELS DESC) | |--------+---------+--------------------------------------------------------+--------------------------------------------------------------| | Iowa | 110 | 1 | 1 | | Iowa | 100 | 2 | 2 | | Kansas | 130 | 1 | 1 | | Kansas | 120 | 2 | 2 | +--------+---------+--------------------------------------------------------+--------------------------------------------------------------+
下面的查询和输出显示了 RANK() 和 DENSE_RANK() 函数如何处理平局值。请注意,对于 DENSE_RANK,排名是 1
、2
、3
、3
、4
。与 RANK() 函数的输出不同,不会跳过排名 4
,因为排名 3
是平局。
SELECT state, bushels, RANK() OVER (ORDER BY bushels DESC), DENSE_RANK() OVER (ORDER BY bushels DESC) FROM corn_production; +--------+---------+-------------------------------------+-------------------------------------------+ | STATE | BUSHELS | RANK() OVER (ORDER BY BUSHELS DESC) | DENSE_RANK() OVER (ORDER BY BUSHELS DESC) | |--------+---------+-------------------------------------+-------------------------------------------| | Kansas | 130 | 1 | 1 | | Kansas | 120 | 2 | 2 | | Iowa | 110 | 3 | 3 | | Iowa | 110 | 3 | 3 | | Iowa | 100 | 5 | 4 | +--------+---------+-------------------------------------+-------------------------------------------+