ClickHouse窗口函数percent_rank详解

ClickHouse窗口函数percent_rank详解

ClickHouse 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(这也是默认设置)

函数特点

  1. 返回值范围:始终在0到1之间
  2. 相同值处理:相同值的行会得到相同的百分位排名
  3. 计算方式:公式为(rank - 1) / (总行数 - 1),其中rank是该行的排名
  4. 边界情况
    • 当只有一行数据时,返回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函数在数据分析中非常有用,特别是在需要:

  1. 比较数据在整体中的相对位置时
  2. 识别异常值或极端值时
  3. 进行数据分箱或分组时
  4. 计算百分位数时

注意事项

  1. percent_rank函数必须与OVER子句一起使用
  2. 默认窗口框架是RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING,不能省略
  3. 对于大数据集,合理使用PARTITION BY可以提高查询效率
  4. 结果精度取决于输入数据的分布情况

通过掌握percent_rank函数,你可以更深入地分析ClickHouse中的数据分布情况,为决策提供更有价值的统计信息。

ClickHouse ClickHouse® 是一个免费的大数据分析型数据库管理系统。 ClickHouse 项目地址: https://gitcode.com/gh_mirrors/cli/ClickHouse

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲁日姝Hunter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值