需求实例:取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
这样做虽然简单,但是有个小瑕疵,因为行数如果不能平均分配,那么编号小的桶会多分数据,造成取出的数据量不准确的情况。