sql需求技术小结—排序后取百分比

需求实例:取a表中按某一字段ct,全局倒序排序后前百分之五的数据,相同排名保留。

方法一:ntile()函数(有缺点)。

使用ntle函数的方法可以快速实现:

ntile函数它把有序的数据集合 平均分配 到 指定的数量(num)个桶中, 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差1。

 语法:    ntile (num)  over ([partition_clause]  order_by_clause)  as your_bucket_num

应用到本例中去:

select
    t2.ct
from
    (select
       ct
       ,ntile(20) over(order by t1.rnd) as nt
    from 
        (select
           ct
           ,row_number() over(order by ct desc) as rnd
        from a)t1
    )t2
where t2.nt=1

这样做虽然简单,但是有个小瑕疵,因为行数如果不能平均分配,那么编号小的桶会多分数据,造成取出的数据量不准确的情况

方法二:COUNT(*) OVER() 函数。

简单粗暴,子查询中直接加入全局count的总计字段,然后过滤条件分子除分母。


                
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值