– 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))