sql 求分位数

– 1 oracle求分位数

SELECT RES3.ORG_NO_5,
       RES3.YM , 
       -- X1的上四分位数
       PERCENTILE_CONT(0.75) WITHIN GROUP(ORDER BY RES3.X1 ASC) AS X1_75,
       -- X1的上中位数
       PERCENTILE_CONT(0.50) WITHIN GROUP(ORDER BY RES3.X1 ASC) AS X1_50,
       -- X1的下四分位数
       PERCENTILE_CONT(0.25) WITHIN GROUP(ORDER BY RES3.X1 ASC) AS X1_25,  
 FROM RES3
 GROUP BY RES3.YM ,RES3.ORG_NO_5

– 2 hive

(SELECT  RES3.PROVINCE_CODE,
         RES3.ORG_NO_5,
         RES3.YM , 
         percentile_approx(RES3.x1,0.25)     AS PERCENT25,    -- x的下四分位
         percentile_approx(RES3.x1 ,0.5)     AS PERCENT50,    -- X1的上中位数
         percentile_approx(RES3.x1,0.75)     AS PERCENT75     -- X1的上四分位数 
  FROM  res3
 GROUP BY RES3.PROVINCE_CODE ,RES3.ORG_NO_5,RES3.YM
 ) 

3-- 充分利用窗口函数
根据中位数的概念,想要求取中位数,需要对一组数据进行排序,找出居于中间位置的数,如果有奇数个数,那最中间的一个为中位数,如果有偶数个数,那中间两个数的平均数为中位数。因此我们需要实现的是排序,取中间值或中间两值的平均值,既然涉及到中间这种位置定位,那自然少不了编号与总体个数的比较。
因此可以概括为排序、编号、找位置、取值。那就需要考虑到排序函数row_number()、计数函数cout()、求均值函数avg()
有一组数:1,3,55,8,34,66,42,88,SQL找出中位数。

按照先前的思路,使用相关函数实现:

select avg(num)
from 
(
    select num 
        ,row_number() over(order by num) as rn 
        ,count(*) over() as n
    from tmp
)as t 
where rn in (floor(n/2)+1,decode(mod(n,2),floor(n/2),floor(n/2)+1))
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值