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

本文介绍了在SQL查询中,如何根据是否使用分区,对数据进行排序并计算分位数。通过row_number()函数实现分区排序,然后根据分区总数计算特定分位数的行数,适用于无分区和有分区两种情况。
摘要由CSDN通过智能技术生成

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

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

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

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

具体例子如下:

例子中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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值