跳到主要内容
跳到主要内容

rank

在其所属分区内为当前行计算带空缺的排名。换句话说,如果某一行的值与之前某一行的值相同,那么它将获得与该行相同的排名。 下一行的排名则等于前一行的排名再加上一个空缺,该空缺等于前一个排名被赋予的次数。

dense_rank 函数提供了类似的行为,但排名序列中没有空缺。

语法

rank ()
  OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column]
        [ROWS or RANGE expression_to_bound_rows_withing_the_group]] | [window_name])
FROM table_name
WINDOW window_name as ([[PARTITION BY grouping_column] [ORDER BY sorting_column])

有关窗口函数语法的更多详细内容,请参阅:Window Functions - Syntax

返回值

  • 当前分区内当前行的序号,允许存在缺口。UInt64

示例

以下示例基于教学视频 Ranking window functions in ClickHouse 中提供的示例。

查询:

CREATE TABLE salaries
(
    `team` String,
    `player` String,
    `salary` UInt32,
    `position` String
)
Engine = Memory;

INSERT INTO salaries FORMAT Values
    ('Port Elizabeth Barbarians', 'Gary Chen', 195000, 'F'),
    ('New Coreystad Archdukes', 'Charles Juarez', 190000, 'F'),
    ('Port Elizabeth Barbarians', 'Michael Stanley', 150000, 'D'),
    ('New Coreystad Archdukes', 'Scott Harrison', 150000, 'D'),
    ('Port Elizabeth Barbarians', 'Robert George', 195000, 'M'),
    ('South Hampton Seagulls', 'Douglas Benson', 150000, 'M'),
    ('South Hampton Seagulls', 'James Henderson', 140000, 'M');
SELECT player, salary,
       rank() OVER (ORDER BY salary DESC) AS rank
FROM salaries;

结果:

   ┌─球员────────────┬─薪资───┬─排名─┐
1. │ Gary Chen       │ 195000 │    1 │
2. │ Robert George   │ 195000 │    1 │
3. │ Charles Juarez  │ 190000 │    3 │
4. │ Douglas Benson  │ 150000 │    4 │
5. │ Michael Stanley │ 150000 │    4 │
6. │ Scott Harrison  │ 150000 │    4 │
7. │ James Henderson │ 140000 │    7 │
   └─────────────────┴────────┴──────┘