跳转到主要内容
对当前行在其分区内进行有间隔的排名。换句话说,如果它遇到的某一行的值与前面某一行的值相同,则该行会获得与前面那一行相同的排名。 下一行的排名则等于前一行的排名,再加上一个间隔;该间隔等于前一个排名出现的次数。 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])
有关窗口函数语法的更多信息,请参见:窗口函数 - 语法. 返回值
  • 当前行在其分区内的序号 (会有间隔) 。 UInt64.
示例 以下示例基于视频教程 Ranking window functions in ClickHouse 中提供的示例。
Query
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');
Query
SELECT player, salary,
       rank() OVER (ORDER BY salary DESC) AS rank
FROM salaries;
Response
   ┌─player──────────┬─salary─┬─rank─┐
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 │
   └─────────────────┴────────┴──────┘
最后修改于 2026年6月10日