SQL随机分组与随机平均分组----ntile(组数) over(partition by 字段1 order by 字段2)

今天发现一个函数,ntile

直接看代码吧

select t.classno ,t.sno,t.score
ntile(5) over(partition by  classno order by t.sno) as ntile
from t_score t order by ntile

意思:根据 classno 分组后再进行每个相同classno的集合尽量地平均分5组。

例如:一班如果有4个同学,则会把这4个同学分成4组1,2,3,4,共4堆,

如果是5个同学,则分成1,2,3,4,5,共5堆

如果是6个同学,则分成(1,6),2,3,4,5,共5堆。

如果是7个同学,则分成(1,6),(2,7),3,4,5,共5堆

注意比较 row_number() over()函数

如果要随机分堆,可以用dbms_random.value

select t.classno ,t.sno,t.score
ntile(5) over(partition by  classno order by dbms_random.value
) ntile
from t_score t order by ntile;


如果要平均地获取数据

select * from (select t.classno ,t.sno,t.score
ntile(5) over(partition by classno ) as ntile
from score t order by ntile) t1 where t1.ntile=1; 

相对每个classno,数据量大的时候,这样获取每个classno的记录几率大致相同,五分一,20%


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值