hive求用户每月的分位数

背景:用户每月的交易金额总数 / 每月的交易金额中位数(按照用户每月汇总后的金额)
hive当中有两个函数可求中位数,percentile和percentile_approx。
下面分别介绍:
percentile:percentile(col, p) col是要计算的列(值必须为int类型),p的取值为0-1,若为0.5,那么就是2分位数,即中位数。

percentile_approx:percentile_approx(col, p)。列为数值类型都可以。
但是percentile计算的结果是精准的,而percentile_approx计算的是不精准的,同时金额又是decimal类型的,不能直接使用,所以在此需要变更一下,也正好金额最多也就到小数点后两位,也就是分
此处上示例代码,
假设a表有用户id(id),交易日期(bill_date),交易金额(amount)。
第一步按照id,日期分组聚合算出每月的汇总金额

select
id,
date_format(bill_date) date_month,
sum(amount) sum_amount
from a
group by id,
date_format(bill_date) 

以上结果为子查询t1,接下来算每个月的中位数

select
id,
date_month,
sum_amount,
percentile(cast(sum_amount * 100 as int),0.5) OVER(PARTITION BY date_month) zws_100,-- 此处将金额乘100,就可转换成int类型的数据,就可以使用计算中位数准确的函数percentile,按照月份来计算中位数,注意将来求分位数时,要记得结果要除以100
sum_amount * 100 / percentile(cast(sum_amount * 100 as int),0.5) OVER(PARTITION BY date_month) -- 此时就可算出分位数了
from t1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值