进阶SQL —— 取指定字段的分位数

如果有分区需求,先对数据分区排序;没有分区需求,则直接对数据排序。

如果有分区需求,求每个分区的总数;没有分区需求,则直接求总行数。

如果有分区需求,筛选排序值 = 分区总数 * 分位数,则可以得到每个分区的分位数;

没有分区需求,筛选排序值 = 总行数 * 分位数,则可以得到分位数。

具体例子如下:

例子中value表示我们想取分位数的列值;orderNum为排序序号;nums为分区总行数;dt为分区。如果没有分区需求,去掉dt相关的部分即可。

最终结果是取了value的0.25分位,0.5分位,0.75分位,0.9分位。具体想取多少分位,直接改数值即可。

select
    t1.dt, 
    value,
    orderNum,
    nums,
    round(orderNum / nums, 2) as quartile
from
    (
        SELECT
            dt,
            value,
            row_number() over (partition by dt order by value) as orderNum
        FROM
            base_table
    ) t1
    left join (
        select
            dt,
            count(*) as nums
        from
            base_table
        group by 
            dt
    ) t2 on t1.dt = t2.dt
    where orderNum = floor(nums * 0.25) or orderNum = floor(nums * 0.5) or orderNum = floor(nums * 0.75) or orderNum = floor(nums * 0.90)

你可能感兴趣的:(MySQL,sql,数据库)