VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

窗口函数

窗口函数用于给组内的值生成序号。窗口函数与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()

    描述: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()

    描述: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)