今天发现一个函数,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%