更新时间:2023-11-29 GMT+08:00
cume_dist
cume_dist函数用于求累计分布,相当于求分区中大于等于或小于等于当前行的数据在分区中的占比。
使用限制
窗口函数的使用限制如下:
- 窗口函数只能出现在select语句中。
- 窗口函数中不能嵌套使用窗口函数和聚合函数。
- 窗口函数不能和同级别的聚合函数一起使用。
命令格式
cume_dist() over([partition_clause] [orderby_clause])
参数说明
参数 |
是否必选 |
说明 |
---|---|---|
partition_clause |
否 |
指定分区。分区列的值相同的行被视为在同一个窗口内。 |
orderby_clause |
否 |
指定数据在一个窗口内如何排序。 |
返回值说明
返回DOUBLE类型的值。
a为NULL,则返回NULL。
示例代码
为便于理解函数的使用方法,本文为您提供源数据,基于源数据提供函数相关示例。创建表salary,并添加数据,命令示例如下:
CREATE EXTERNAL TABLE salary ( dept STRING, -- 部⻔名称 userid string, -- 员⼯ID sal INT -- 薪⽔ ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' stored as textfile;
添加数据如下:
d1,user1,1000 d1,user2,2000 d1,user3,3000 d2,user4,4000 d2,user5,5000
- 统计小于等于当前薪水的人数占比
select dept, userid, sal, cume_dist() over(order by sal) as cume1 from salary; -- 结果: d1 user1 1000 0.2 d1 user2 2000 0.4 d1 user3 3000 0.6 d2 user4 4000 0.8 d2 user5 5000 1.0
- 按部⻔分组统计⼩于等于当前薪⽔的⼈数的⽐例
select dept, userid, sal, cume_dist() over (partition by dept order by sal) as cume2 from salary; -- 结果: d1 user1 1000 0.3333333333333333 d1 user2 2000 0.6666666666666666 d1 user3 3000 1.0 d2 user4 4000 0.5 d2 user5 5000 1.0
- 按照sal降序排序后,结果就是统计 ⼤于等于 当前薪⽔的⼈数的⽐例
select dept, userid, sal, cume_dist() over(order by sal desc) as cume3 from salary; -- 结果: d2 user5 5000 0.2 d2 user4 4000 0.4 d1 user3 3000 0.6 d1 user2 2000 0.8 d1 user1 1000 1.0 select dept, userid, sal, cume_dist() over(partition by dept order by sal desc) as cume4 from salary; -- 结果: d1 user3 3000 0.3333333333333333 d1 user2 2000 0.6666666666666666 d1 user1 1000 1.0 d2 user5 5000 0.5 d2 user4 4000 1.0
父主题: 分析窗口函数