ClickHouse窗口函数percent_rank详解
ClickHouse ClickHouse® 是一个免费的大数据分析型数据库管理系统。 项目地址: https://gitcode.com/gh_mirrors/cli/ClickHouse
什么是percent_rank函数
percent_rank是ClickHouse提供的一个窗口函数,用于计算数据行在其窗口分区内的相对排名(即百分位排名)。这个函数返回的值范围在0到1之间,其中0表示最高排名,1表示最低排名。
函数语法
percent_rank函数的基本语法如下:
percent_rank() OVER (
[PARTITION BY 分组列]
[ORDER BY 排序列]
[RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING]
)
或者使用预定义的窗口:
percent_rank() OVER window_name
其中:
PARTITION BY
子句用于将数据分成不同的组,函数会在每个组内独立计算ORDER BY
子句决定数据的排序方式,影响百分位排名的计算RANGE BETWEEN...
定义了窗口的边界,percent_rank函数要求使用RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
(这也是默认设置)
函数特点
- 返回值范围:始终在0到1之间
- 相同值处理:相同值的行会得到相同的百分位排名
- 计算方式:公式为
(rank - 1) / (总行数 - 1)
,其中rank是该行的排名 - 边界情况:
- 当只有一行数据时,返回0
- 当所有行具有相同值时,所有行都返回0
实际应用示例
假设我们有一个包含运动员薪资的数据表:
CREATE TABLE salaries (
`team` String,
`player` String,
`salary` UInt32,
`position` String
) Engine = Memory;
INSERT INTO salaries 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');
示例1:基本使用
计算所有运动员按薪资降序的百分位排名:
SELECT
player,
salary,
percent_rank() OVER (ORDER BY salary DESC) AS percent_rank
FROM salaries;
结果解释:
- Gary Chen和Robert George薪资最高,百分位排名为0
- Charles Juarez排名第三,百分位排名约为0.333
- 薪资相同的Michael Stanley、Scott Harrison和Douglas Benson都获得相同的百分位排名0.5
- James Henderson薪资最低,百分位排名为1
示例2:分组计算
按球队分组计算百分位排名:
SELECT
team,
player,
salary,
percent_rank() OVER (PARTITION BY team ORDER BY salary DESC) AS team_percent_rank
FROM salaries;
这样计算的结果是每个球队内部球员薪资的百分位排名,可以比较同一球队内不同球员的薪资位置。
使用场景
percent_rank函数在数据分析中非常有用,特别是在需要:
- 比较数据在整体中的相对位置时
- 识别异常值或极端值时
- 进行数据分箱或分组时
- 计算百分位数时
注意事项
- percent_rank函数必须与OVER子句一起使用
- 默认窗口框架是
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
,不能省略 - 对于大数据集,合理使用PARTITION BY可以提高查询效率
- 结果精度取决于输入数据的分布情况
通过掌握percent_rank函数,你可以更深入地分析ClickHouse中的数据分布情况,为决策提供更有价值的统计信息。
ClickHouse ClickHouse® 是一个免费的大数据分析型数据库管理系统。 项目地址: https://gitcode.com/gh_mirrors/cli/ClickHouse
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考