窗口函数
窗口函数用于给组内的值生成序号。窗口函数与OVER语句一起使用。OVER语句用于对数据进行分组,并对组内元素进行排序。
- 窗口函数中的order by后面必须跟字段名,若order by后面跟数字,该数字会被按照常量处理,因此对目标列没有起到排序的作用。
- 列存表目前只支持rank(expression)和row_number(expression)两个函数。
为方便后续函数的功能演示创建测试表并插入数据。
CREATE TABLE student_score (
id VARCHAR ( 10 ) NOT NULL,
name VARCHAR ( 20 ) NOT NULL,
score NUMBER ( 32 ) NOT NULL );
insert into student_score(id,name,score) values(1,'赵子龙',95);
insert into student_score(id,name,score) values(2,'马超',80);
insert into student_score(id,name,score) values(3,'关羽',95);
insert into student_score(id,name,score) values(1,'诸葛亮',100);
insert into student_score(id,name,score) values(2,'阿斗',60);
insert into student_score(id,name,score) values(3,'刘备',80);
SELECT * FROM student_score;
返回结果为:
id | name | score
----+--------+-------
1 | 赵子龙 | 95
2 | 马超 | 80
3 | 关羽 | 95
1 | 诸葛亮 | 100
2 | 阿斗 | 60
3 | 刘备 | 80
(6 rows)
-
描述:RANK函数为各组内值生成跳跃排序序号,其中,相同的值具有相同序号。
返回值类型:BIGINT
示例:
SELECT ss.ID,ss.NAME,ss.SCORE,RANK ( ) OVER ( ORDER BY ss.SCORE DESC ) RANK FROM STUDENT_SCORE ss;
返回结果如下:
id | name | score | rank ----+--------+-------+------ 1 | 诸葛亮 | 100 | 1 1 | 赵子龙 | 95 | 2 3 | 关羽 | 95 | 2 2 | 马超 | 80 | 4 3 | 刘备 | 80 | 4 2 | 阿斗 | 60 | 6 (6 rows)
-
描述:ROW_NUMBER函数为各组内值生成连续排序序号,其中,相同的值其序号也不相同。
返回值类型:BIGINT
示例:
SELECT ss.ID,ss.NAME,ss.SCORE,ROW_NUMBER ( ) OVER ( ORDER BY ss.SCORE DESC ) ROW_NUMBER FROM STUDENT_SCORE ss;
返回结果如下:
id | name | score | row_number ----+--------+-------+------------ 1 | 诸葛亮 | 100 | 1 1 | 赵子龙 | 95 | 2 3 | 关羽 | 95 | 3 2 | 马超 | 80 | 4 3 | 刘备 | 80 | 5 2 | 阿斗 | 60 | 6 (6 rows)
DENSE_RANK()
描述:DENSE_RANK函数为各组内值生成连续排序序号,其中,相同的值具有相同序号。
返回值类型:BIGINT
示例:
SELECT ss.ID,ss.NAME,ss.SCORE,dense_rank() OVER ( ORDER BY ss.SCORE DESC ) dense_rank FROM STUDENT_SCORE ss;
返回结果如下:
id | name | score | dense_rank ----+--------+-------+------------ 1 | 诸葛亮 | 100 | 1 1 | 赵子龙 | 95 | 2 3 | 关羽 | 95 | 2 2 | 马超 | 80 | 3 3 | 刘备 | 80 | 3 2 | 阿斗 | 60 | 4 (6 rows)
PERCENT_RANK()
描述:PERCENT_RANK函数为各组内对应值生成相对序号,即根据公式
(rank - 1) / (total rows - 1)
计算所得的值。其中rank为该值依据RANK函数所生成的对应序号,totalrows为该分组内的总元素个数。返回值类型:DOUBLE PRECISION
示例:
SELECT *, percent_rank() OVER (PARTITION BY id ORDER BY score DESC) percent_rank FROM STUDENT_SCORE;
返回结果如下:
id | name | score | percent_rank ----+--------+-------+-------------- 1 | 诸葛亮 | 100 | 0 1 | 赵子龙 | 95 | 1 2 | 马超 | 80 | 0 2 | 阿斗 | 60 | 1 3 | 关羽 | 95 | 0 3 | 刘备 | 80 | 1 (6 rows)
CUME_DIST()
描述:CUME_DIST函数为各组内对应值生成累积分布序号。即根据公式(小于等于当前值的数据行数)/(该分组总行数totalrows)计算所得的相对序号。
返回值类型:DOUBLE PRECISION
示例:
SELECT *, cume_dist() OVER (PARTITION BY id ORDER BY score DESC) cume_dist FROM STUDENT_SCORE;
返回结果如下:
id | name | score | cume_dist ----+--------+-------+----------- 1 | 诸葛亮 | 100 | .5 1 | 赵子龙 | 95 | 1 2 | 马超 | 80 | .5 2 | 阿斗 | 60 | 1 3 | 关羽 | 95 | .5 3 | 刘备 | 80 | 1 (6 rows)
NTILE(num_buckets integer)
描述:NTILE函数根据num_buckets integer将有序的数据集合平均分配到num_buckets所指定数量的桶中,并将桶号分配给每一行。分配时应尽量做到平均分配。
返回值类型:INTEGER
示例:
SELECT ss.ID,ss.NAME,ss.SCORE,NTILE(4) OVER ( ORDER BY ss.SCORE DESC ) NTILE FROM STUDENT_SCORE ss;
返回结果如下:
id | name | score | ntile ----+--------+-------+------- 1 | 诸葛亮 | 100 | 1 1 | 赵子龙 | 95 | 1 3 | 关羽 | 95 | 2 2 | 马超 | 80 | 2 3 | 刘备 | 80 | 3 2 | 阿斗 | 60 | 4 (6 rows)
LAG(value any [, offset integer [, default any ]])
描述:LAG函数为各组内对应值生成滞后值。即当前值对应的行数往前偏移offset位后所得行的value值作为序号。若经过偏移后行数不存在,则对应结果取为default值。若无指定,在默认情况下,offset取为1,default值取为NULL。
返回值类型:与参数数据类型相同。
示例:
SELECT ss.ID,ss.NAME,ss.SCORE,LAG(score) OVER ( ORDER BY ss.SCORE DESC ) LAG FROM STUDENT_SCORE ss;
返回结果如下:
id | name | score | lag ----+--------+-------+----- 1 | 诸葛亮 | 100 | 1 | 赵子龙 | 95 | 100 3 | 关羽 | 95 | 95 2 | 马超 | 80 | 95 3 | 刘备 | 80 | 80 2 | 阿斗 | 60 | 80 (6 rows)
LEAD(value any [, offset integer [, default any ]])
描述:LEAD函数为各组内对应值生成提前值。即当前值对应的行数向后偏移offset位后所得行的value值作为序号。若经过向后偏移后行数超过当前组内的总行数,则对应结果取为default值。若无指定,在默认情况下,offset取为1,default值取为NULL。
返回值类型:与参数数据类型相同。
示例:
SELECT ss.ID,ss.NAME,ss.SCORE,LEAD(score) OVER ( ORDER BY ss.SCORE DESC ) LEAD FROM STUDENT_SCORE ss;
返回结果如下:
id | name | score | lead ----+--------+-------+------ 1 | 诸葛亮 | 100 | 95 1 | 赵子龙 | 95 | 95 3 | 关羽 | 95 | 80 2 | 马超 | 80 | 80 3 | 刘备 | 80 | 60 2 | 阿斗 | 60 | (6 rows)
FIRST_VALUE(value any)
描述:FIRST_VALUE函数取各组内的第一个值作为返回结果。
返回值类型:与参数数据类型相同。
示例:
SELECT *,first_value(score) OVER (PARTITION BY id ORDER BY score DESC) first_score FROM STUDENT_SCORE;
返回结果如下:
id | name | score | first_score ----+--------+-------+------------- 1 | 诸葛亮 | 100 | 100 1 | 赵子龙 | 95 | 100 2 | 马超 | 80 | 80 2 | 阿斗 | 60 | 80 3 | 关羽 | 95 | 95 3 | 刘备 | 80 | 95 (6 rows)
LAST_VALUE(value any)
描述:LAST_VALUE函数取各组内的最后一个值作为返回结果。
返回值类型:与参数数据类型相同。
示例:
SELECT*,last_value(score) OVER (PARTITION BY id ORDER BY score DESC) last_score FROM STUDENT_SCORE;
返回结果如下:
id | name | score | last_score ----+--------+-------+------------ 1 | 诸葛亮 | 100 | 100 1 | 赵子龙 | 95 | 95 2 | 马超 | 80 | 80 2 | 阿斗 | 60 | 60 3 | 关羽 | 95 | 95 3 | 刘备 | 80 | 80 (6 rows)
NTH_VALUE(value any, nth integer)
描述:NTH_VALUE函数返回该组内的第nth行作为结果。若该行不存在,则默认返回NULL。
返回值类型:与参数数据类型相同。
示例:
SELECT *,nth_value(score,2) OVER (PARTITION BY id ORDER BY score DESC) nth_value FROM STUDENT_SCORE;
返回结果如下:
id | name | score | nth_value ----+--------+-------+----------- 1 | 诸葛亮 | 100 | 1 | 赵子龙 | 95 | 95 2 | 马超 | 80 | 2 | 阿斗 | 60 | 60 3 | 关羽 | 95 | 3 | 刘备 | 80 | 80 (6 rows)