NTILE
语法:
NTILE(expr) over([ partition by expr1[ ,... ] ] order by expr2[ ,... ] [ ASC | DESC ] [NULLS FIRST | LAST])
功能:将一个有序数据集划分为若干桶(桶的数量由expr的结果决定,每个组的桶数可能不同),并为每一行分配适当的存储桶编号,编号从1开始到expr(如果expr非整数,则将该值向下取整)。
expr1是分组的列字段名称或者表达式,expr2是排序的列字段名称或者表达式,over内必须要有排序子句。
expr是存储桶的数量。
如果expr的结果与一行记录相关(如ntile(f1)),则expr的值取组内条记录进行计算。
expr表达式限制一个参数,该参数为整数,取值范围是[1,9223372036854775807]。
[NULLS FIRST | LAST]请参见 ORDER BY。
[ ASC | DESC ]请参见•ORDER BY。
说明:
不同存储通中的函数多可以相差1(记录数与桶数不能整除时,余数均匀得分配到前几个桶中)。
如果记录数小于桶数,则前n(n为记录数)个桶都分配一条记录,其余桶为空。
expr表达式不能嵌套窗口函数,不能是子查询
示例:
将student表中数据按照班级分组,按照成绩排序分为2个等级。
--删除student表。
DROP TABLE IF EXISTS student;
--创建student表。
CREATE TABLE student
(
student_id int,
class int,
grade int
);
--新增数据。
insert into student values(1,1,90);
insert into student values(2,1,91);
insert into student values(3,1,92);
insert into student values(4,1,93);
insert into student values(1,2,94);
insert into student values(2,2,95);
insert into student values(3,2,96);
insert into student values(4,2,97);
--将student表中数据按照班级分组,按照成绩排序分为2个等级。
select student_id,class,grade, ntile(2) over(partition by class order by grade) from student;
STUDENT_ID CLASS GRADE NTILE(2) OVER(PARTITION BY CLASS ORDER BY GRADE)
------------ ------------ ------------ ------------------------------------------------
1 1 90 1
2 1 91 1
3 1 92 2
4 1 93 2
1 2 94 1
2 2 95 1
3 2 96 2
4 2 97 2
8 rows fetched.