含义:
将有序分区中的行分发到指定数目的组中。 各个组有编号,编号从1开始。 对于每一个行,NTILE 将返回此行所属的组的编号。
ntile 将返回此行所属的组的编号。这就相当于将查询出来的记录集放到指定长度的数组中,每一个数组元素存放一定数量的记录。ntile函数为每条记录生成的序号就是这条记录所有的数组元素的索引(从1开始)。也可以将每一个分配记录的数组元素称为“桶”。
语法:
NTILE (integer_expression) OVER ( [ <partition_by_clause> ] < order_by_clause > )
举例:学生成绩表如下:
使用NTILE()函数,按课程分组后,再分3组,sql如下:
select ntile(3) over(partition by gc_no order by gs_scoure desc )a, * from test.[dbo].[grade]
执行结果如下:
从结果看:根据体育分组时,不能平均分配,出现2行,2行,1行的情况,具体桶的分配原则如下:
先举个例子:将51条记录分配成5组,51%5==1不能平均分配,则先分出去一组(51/5)+1=11条记录,然后比较余下的 51-11=40
条记录能否平均分配给未分配的4组,能平均分配,则剩下的4组,每组各40/4=10条记录,分配完成,分配结果为:11,10,10,10,10,我开始就以为他会分配成 11,11,11,11,7。
如果有分组,就在组内进行分桶。
首先系统会去检查能不能对所有满足条件的记录进行平均分组,若能则直接平均分配就完成分组了;若不能,则会先分出一个组,这个组分多少条记录呢?就是(总记录数/总组数)+1 条,之所以分配 (总记录数/总组数)+1 条是因为当不能进行平均分组时,总记录数%总组数肯定是有余的,又因为分组约定1,所以先分出去的组需要+1条。
分完之后系统会继续去比较余下的记录数和未分配的组数能不能进行平均分配,若能,则平均分配余下的记录;若不能,则再分出去一组,这个组的记录数也是(总记录数/总组数)+1条。>
然后系统继续去比较余下的记录数和未分配的组数能不能进行平均分配,若能,则平均分配余下的记录;若还是不能,则再分配出去一组,继续比较余下的…这样一直进行下去,直至分组完成。