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])
有关窗口函数语法的更多详细信息,请参阅:窗口函数 - 语法。
返回值
- 分区中当前行的数字,包括间隙。UInt64。
示例
以下示例基于视频教学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;
结果
┌─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 │
└─────────────────┴────────┴──────┘