GBase 8c
其他
文章

GBase 8c 数据类型——窗口函数

发表于2023-12-07 15:01:0739次浏览3个评论

列存表目前只支持rank(expression)和row_number(expression)两个函数。
 

 

窗口函数与OVER语句一起使用。OVER语句用于对数据进行分组,并对组内元素进行排序。窗口函数用于给组内的值生成序号。

 

窗口函数中的order by后面必须跟字段名,若order by后面跟数字,该数字会被按照常量处理,因此对目标列没有起到排序的作用。

l RANK()

描述:RANK函数为各组内值生成跳跃排序序号,其中,相同的值具有相同序号。

返回值类型:BIGINT

示例:

 gbase=# SELECT d_moy, d_fy_week_seq, rank() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM public.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2;

   d_moy | d_fy_week_seq | rank

-------+---------------+------

     1 |             1 |    1

     1 |             1 |    1

     1 |             1 |    1

     1 |             1 |    1

     1 |             1 |    1

     1 |             1 |    1

     1 |             1 |    1

     1 |             2 |    8

     1 |             2 |    8

     1 |             2 |    8

     1 |             2 |    8

     1 |             2 |    8

     1 |             2 |    8

     1 |             2 |    8

     1 |             3 |   15

     1 |             3 |   15

     1 |             3 |   15

     1 |             3 |   15

     1 |             3 |   15

     1 |             3 |   15

     1 |             3 |   15

     1 |             4 |   22

     1 |             4 |   22

     1 |             4 |   22

     1 |             4 |   22

     1 |             4 |   22

     1 |             4 |   22

     1 |             4 |   22

     1 |             5 |   29

     1 |             5 |   29

     2 |             5 |    1

     2 |             5 |    1

     2 |             5 |    1

     2 |             5 |    1

     2 |             5 |    1

     2 |             6 |    6

     2 |             6 |    6

     2 |             6 |    6

     2 |             6 |    6

     2 |             6 |    6

     2 |             6 |    6

     2 |             6 |    6

(42 rows)

l ROW_NUMBER()

描述:ROW_NUMBER函数为各组内值生成连续排序序号,其中,相同的值其序号也不相同。

返回值类型:BIGINT

示例:

 gbase=# SELECT d_moy, d_fy_week_seq, Row_number() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM public.date_dim  WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2;

 d_moy | d_fy_week_seq | row_number

-------+---------------+------------

     1 |             1 |          1

     1 |             1 |          2

     1 |             1 |          3

     1 |             1 |          4

     1 |             1 |          5

     1 |             1 |          6

     1 |             1 |          7

     1 |             2 |          8

     1 |             2 |          9

     1 |             2 |         10

     1 |             2 |         11

     1 |             2 |         12

     1 |             2 |         13

     1 |             2 |         14

     1 |             3 |         15

     1 |             3 |         16

     1 |             3 |         17

     1 |             3 |         18

     1 |             3 |         19

     1 |             3 |         20

     1 |             3 |         21

     1 |             4 |         22

     1 |             4 |         23

     1 |             4 |         24

     1 |             4 |         25

     1 |             4 |         26

     1 |             4 |         27

     1 |             4 |         28

     1 |             5 |         29

     1 |             5 |         30

     2 |             5 |          1

     2 |             5 |          2

     2 |             5 |          3

     2 |             5 |          4

     2 |             5 |          5

     2 |             6 |          6

     2 |             6 |          7

     2 |             6 |          8

     2 |             6 |          9

     2 |             6 |         10

     2 |             6 |         11

     2 |             6 |         12

(42 rows)

l DENSE_RANK()

描述:DENSE_RANK函数为各组内值生成连续排序序号,其中,相同的值具有相同序号。

返回值类型:BIGINT

示例:

 gbase=# SELECT d_moy, d_fy_week_seq, dense_rank() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM public.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2;

 d_moy | d_fy_week_seq | dense_rank

-------+---------------+------------

     1 |             1 |          1

     1 |             1 |          1

     1 |             1 |          1

     1 |             1 |          1

     1 |             1 |          1

     1 |             1 |          1

     1 |             1 |          1

     1 |             2 |          2

     1 |             2 |          2

     1 |             2 |          2

     1 |             2 |          2

     1 |             2 |          2

     1 |             2 |          2

     1 |             2 |          2

     1 |             3 |          3

     1 |             3 |          3

     1 |             3 |          3

     1 |             3 |          3

     1 |             3 |          3

     1 |             3 |          3

     1 |             3 |          3

     1 |             4 |          4

     1 |             4 |          4

     1 |             4 |          4

     1 |             4 |          4

     1 |             4 |          4

     1 |             4 |          4

     1 |             4 |          4

     1 |             5 |          5

     1 |             5 |          5

     2 |             5 |          1

     2 |             5 |          1

     2 |             5 |          1

     2 |             5 |          1

     2 |             5 |          1

     2 |             6 |          2

     2 |             6 |          2

     2 |             6 |          2

     2 |             6 |          2

     2 |             6 |          2

     2 |             6 |          2

     2 |             6 |          2

(42 rows)

l PERCENT_RANK()

描述:PERCENT_RANK函数为各组内对应值生成相对序号,即根据公式 (rank - 1) / (total rows - 1)计算所得的值。其中rank为该值依据RANK函数所生成的对应序号,totalrows为该分组内的总元素个数。

返回值类型:DOUBLE PRECISION

示例:

 gbase=# SELECT d_moy, d_fy_week_seq, percent_rank() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM public.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2;

 d_moy | d_fy_week_seq |   percent_rank   

-------+---------------+------------------

     1 |             1 |                0

     1 |             1 |                0

     1 |             1 |                0

     1 |             1 |                0

     1 |             1 |                0

     1 |             1 |                0

     1 |             1 |                0

     1 |             2 | .241379310344828

     1 |             2 | .241379310344828

     1 |             2 | .241379310344828

     1 |             2 | .241379310344828

     1 |             2 | .241379310344828

     1 |             2 | .241379310344828

     1 |             2 | .241379310344828

     1 |             3 | .482758620689655

     1 |             3 | .482758620689655

     1 |             3 | .482758620689655

     1 |             3 | .482758620689655

     1 |             3 | .482758620689655

     1 |             3 | .482758620689655

     1 |             3 | .482758620689655

     1 |             4 | .724137931034483

     1 |             4 | .724137931034483

     1 |             4 | .724137931034483

     1 |             4 | .724137931034483

     1 |             4 | .724137931034483

     1 |             4 | .724137931034483

     1 |             4 | .724137931034483

     1 |             5 |  .96551724137931

     1 |             5 |  .96551724137931

     2 |             5 |                0

     2 |             5 |                0

     2 |             5 |                0

     2 |             5 |                0

     2 |             5 |                0

     2 |             6 | .454545454545455

     2 |             6 | .454545454545455

     2 |             6 | .454545454545455

     2 |             6 | .454545454545455

     2 |             6 | .454545454545455

     2 |             6 | .454545454545455

     2 |             6 | .454545454545455

(42 rows)

l CUME_DIST()

描述:CUME_DIST函数为各组内对应值生成累积分布序号。即根据公式(小于等于当前值的数据行数)/(该分组总行数totalrows)计算所得的相对序号。

返回值类型:DOUBLE PRECISION

示例:

 gbase=# SELECT d_moy, d_fy_week_seq, cume_dist() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM public.date_dim e_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2;

 d_moy | d_fy_week_seq |    cume_dist     

-------+---------------+------------------

     1 |             1 | .233333333333333

     1 |             1 | .233333333333333

     1 |             1 | .233333333333333

     1 |             1 | .233333333333333

     1 |             1 | .233333333333333

     1 |             1 | .233333333333333

     1 |             1 | .233333333333333

     1 |             2 | .466666666666667

     1 |             2 | .466666666666667

     1 |             2 | .466666666666667

     1 |             2 | .466666666666667

     1 |             2 | .466666666666667

     1 |             2 | .466666666666667

     1 |             2 | .466666666666667

     1 |             3 |               .7

     1 |             3 |               .7

     1 |             3 |               .7

     1 |             3 |               .7

     1 |             3 |               .7

     1 |             3 |               .7

     1 |             3 |               .7

     1 |             4 | .933333333333333

     1 |             4 | .933333333333333

     1 |             4 | .933333333333333

     1 |             4 | .933333333333333

     1 |             4 | .933333333333333

     1 |             4 | .933333333333333

     1 |             4 | .933333333333333

     1 |             5 |                1

     1 |             5 |                1

     2 |             5 | .416666666666667

     2 |             5 | .416666666666667

     2 |             5 | .416666666666667

     2 |             5 | .416666666666667

     2 |             5 | .416666666666667

     2 |             6 |                1

     2 |             6 |                1

     2 |             6 |                1

     2 |             6 |                1

     2 |             6 |                1

     2 |             6 |                1

     2 |             6 |                1

(42 rows)

l NTILE(num_buckets integer)

描述:NTILE函数根据num_buckets integer将有序的数据集合平均分配到num_buckets所指定数量的桶中,并将桶号分配给每一行。分配时应尽量做到平均分配。

返回值类型:INTEGER

示例:

 gbase=# SELECT d_moy, d_fy_week_seq, ntile(3) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM public.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2;

 d_moy | d_fy_week_seq | ntile

-------+---------------+-------

     1 |             1 |     1

     1 |             1 |     1

     1 |             1 |     1

     1 |             1 |     1

     1 |             1 |     1

     1 |             1 |     1

     1 |             1 |     1

     1 |             2 |     1

     1 |             2 |     1

     1 |             2 |     1

     1 |             2 |     2

     1 |             2 |     2

     1 |             2 |     2

     1 |             2 |     2

     1 |             3 |     2

     1 |             3 |     2

     1 |             3 |     2

     1 |             3 |     2

     1 |             3 |     2

     1 |             3 |     2

     1 |             3 |     3

     1 |             4 |     3

     1 |             4 |     3

     1 |             4 |     3

     1 |             4 |     3

     1 |             4 |     3

     1 |             4 |     3

     1 |             4 |     3

     1 |             5 |     3

     1 |             5 |     3

     2 |             5 |     1

     2 |             5 |     1

     2 |             5 |     1

     2 |             5 |     1

     2 |             5 |     2

     2 |             6 |     2

     2 |             6 |     2

     2 |             6 |     2

     2 |             6 |     3

     2 |             6 |     3

     2 |             6 |     3

     2 |             6 |     3

(42 rows)

l LAG(value any [, offset integer [, default any ]])

描述:LAG函数为各组内对应值生成滞后值。即当前值对应的行数往前偏移offset位后所得行的value值作为序号。若经过偏移后行数不存在,则对应结果取为default值。若无指定,在默认情况下,offset取为1,default值取为NULL。

返回值类型:与参数数据类型相同。

示例:

 gbase=# SELECT d_moy, d_fy_week_seq, lag(d_moy,3,null) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM public.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2;

 d_moy | d_fy_week_seq | lag

-------+---------------+-----

     1 |             1 |    

     1 |             1 |    

     1 |             1 |    

     1 |             1 |   1

     1 |             1 |   1

     1 |             1 |   1

     1 |             1 |   1

     1 |             2 |   1

     1 |             2 |   1

     1 |             2 |   1

     1 |             2 |   1

     1 |             2 |   1

     1 |             2 |   1

     1 |             2 |   1

     1 |             3 |   1

     1 |             3 |   1

     1 |             3 |   1

     1 |             3 |   1

     1 |             3 |   1

     1 |             3 |   1

     1 |             3 |   1

     1 |             4 |   1

     1 |             4 |   1

     1 |             4 |   1

     1 |             4 |   1

     1 |             4 |   1

     1 |             4 |   1

     1 |             4 |   1

     1 |             5 |   1

     1 |             5 |   1

     2 |             5 |    

     2 |             5 |    

     2 |             5 |    

     2 |             5 |   2

     2 |             5 |   2

     2 |             6 |   2

     2 |             6 |   2

     2 |             6 |   2

     2 |             6 |   2

     2 |             6 |   2

     2 |             6 |   2

     2 |             6 |   2

(42 rows)

l LEAD(value any [, offset integer [, default any ]])

描述:LEAD函数为各组内对应值生成提前值。即当前值对应的行数向后偏移offset位后所得行的value值作为序号。若经过向后偏移后行数超过当前组内的总行数,则对应结果取为default值。若无指定,在默认情况下,offset取为1,default值取为NULL。

返回值类型:与参数数据类型相同。

示例:

 gbase=# SELECT d_moy, d_fy_week_seq, lead(d_fy_week_seq,2) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM  public.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2;

d_moy | d_fy_week_seq | lead

-------+---------------+------

     1 |             1 |    1

     1 |             1 |    1

     1 |             1 |    1

     1 |             1 |    1

     1 |             1 |    1

     1 |             1 |    2

     1 |             1 |    2

     1 |             2 |    2

     1 |             2 |    2

     1 |             2 |    2

     1 |             2 |    2

     1 |             2 |    2

     1 |             2 |    3

     1 |             2 |    3

     1 |             3 |    3

     1 |             3 |    3

     1 |             3 |    3

     1 |             3 |    3

     1 |             3 |    3

     1 |             3 |    4

     1 |             3 |    4

     1 |             4 |    4

     1 |             4 |    4

     1 |             4 |    4

     1 |             4 |    4

     1 |             4 |    4

     1 |             4 |    5

     1 |             4 |    5

     1 |             5 |     

     1 |             5 |     

     2 |             5 |    5

     2 |             5 |    5

     2 |             5 |    5

     2 |             5 |    6

     2 |             5 |    6

     2 |             6 |    6

     2 |             6 |    6

     2 |             6 |    6

     2 |             6 |    6

     2 |             6 |    6

     2 |             6 |     

     2 |             6 |     

(42 rows)

l FIRST_VALUE(value any)

描述:FIRST_VALUE函数取各组内的第一个值作为返回结果。

返回值类型:与参数数据类型相同。

示例:

 gbase=# SELECT d_moy, d_fy_week_seq, first_value(d_fy_week_seq) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM public.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2;

 d_moy | d_fy_week_seq | first_value

-------+---------------+-------------

     1 |             1 |           1

     1 |             1 |           1

     1 |             1 |           1

     1 |             1 |           1

     1 |             1 |           1

     1 |             1 |           1

     1 |             1 |           1

     1 |             2 |           1

     1 |             2 |           1

     1 |             2 |           1

     1 |             2 |           1

     1 |             2 |           1

     1 |             2 |           1

     1 |             2 |           1

     1 |             3 |           1

     1 |             3 |           1

     1 |             3 |           1

     1 |             3 |           1

     1 |             3 |           1

     1 |             3 |           1

     1 |             3 |           1

     1 |             4 |           1

     1 |             4 |           1

     1 |             4 |           1

     1 |             4 |           1

     1 |             4 |           1

     1 |             4 |           1

     1 |             4 |           1

     1 |             5 |           1

     1 |             5 |           1

     2 |             5 |           5

     2 |             5 |           5

     2 |             5 |           5

     2 |             5 |           5

     2 |             5 |           5

     2 |             6 |           5

     2 |             6 |           5

     2 |             6 |           5

     2 |             6 |           5

     2 |             6 |           5

     2 |             6 |           5

     2 |             6 |           5

(42 rows)

l LAST_VALUE(value any)

描述:LAST_VALUE函数取各组内的最后一个值作为返回结果。

返回值类型:与参数数据类型相同。

示例:

 gbase=# SELECT d_moy, d_fy_week_seq, last_value(d_moy) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM public.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 6 ORDER BY 1,2;

  d_moy | d_fy_week_seq | last_value

-------+---------------+------------

     1 |             1 |          1

     1 |             1 |          1

     1 |             1 |          1

     1 |             1 |          1

     1 |             1 |          1

     1 |             1 |          1

     1 |             1 |          1

     1 |             2 |          1

     1 |             2 |          1

     1 |             2 |          1

     1 |             2 |          1

     1 |             2 |          1

     1 |             2 |          1

     1 |             2 |          1

     1 |             2 |          1

     1 |             3 |          1

     1 |             3 |          1

     1 |             3 |          1

     1 |             3 |          1

     1 |             3 |          1

     1 |             3 |          1

     1 |             3 |          1

     1 |             4 |          1

     1 |             4 |          1

     1 |             4 |          1

     1 |             4 |          1

     1 |             4 |          1

     1 |             4 |          1

     1 |             4 |          1

     1 |             5 |          1

     1 |             5 |          1

     2 |             5 |          2

     2 |             5 |          2

     2 |             5 |          2

     2 |             5 |          2

     2 |             5 |          2

(35 rows)

l NTH_VALUE(value any, nth integer)

描述:NTH_VALUE函数返回该组内的第nth行作为结果。若该行不存在,则默认返回NULL。

返回值类型:与参数数据类型相同。

示例:

 gbase=# SELECT d_moy, d_fy_week_seq, nth_value(d_fy_week_seq,6) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM public.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 6 ORDER BY 1,2;

 d_moy | d_fy_week_seq | nth_value

-------+---------------+-----------

     1 |             1 |         1

     1 |             1 |         1

     1 |             1 |         1

     1 |             1 |         1

     1 |             1 |         1

     1 |             1 |         1

     1 |             1 |         1

     1 |             2 |         1

     1 |             2 |         1

     1 |             2 |         1

     1 |             2 |         1

     1 |             2 |         1

     1 |             2 |         1

     1 |             2 |         1

     1 |             3 |         1

     1 |             3 |         1

     1 |             3 |         1

     1 |             3 |         1

     1 |             3 |         1

     1 |             3 |         1

     1 |             3 |         1

     1 |             4 |         1

     1 |             4 |         1

     1 |             4 |         1

     1 |             4 |         1

     1 |             4 |         1

     1 |             4 |         1

     1 |             4 |         1

     1 |             5 |         1

     1 |             5 |         1

     2 |             5 |          

     2 |             5 |          

     2 |             5 |          

     2 |             5 |          

     2 |             5 |          

(35 rows)

评论

登录后才可以发表评论
崔哥发表于 8个月前
汉皇重色思倾国,御宇多年求不得。杨家有女初长成,养在深闺人未识。天生丽质难自弃,一朝选在君王侧。回眸一笑百媚生,六宫粉黛无颜色。春寒赐浴华清池,温泉水滑洗凝脂。侍儿扶起娇无力,始是新承恩泽时。云鬓花颜金步摇,芙蓉帐暖度春宵。春宵苦短日高起,从此君王不早朝。承欢侍宴无闲暇,春从春游夜专夜。后宫佳丽三千人,三千宠爱在一身。金屋妆成娇侍夜,玉楼宴罢醉和春。姊妹弟兄皆列土,可怜光彩生门户。遂令天下父母心,不重生男重生女。骊宫高处入青云,仙乐风飘处处闻。缓歌慢舞凝丝竹,尽日君王看不足。渔阳鼙鼓动地来,惊破霓裳羽衣曲。九重城阙烟尘生,千乘万骑西南行。翠华摇摇行复止,西出都门百余里。六军不发无奈何,宛转蛾眉马前死。花钿委地无人收,翠翘金雀玉搔头。君王掩面救不得,回看血泪相和流。黄埃散漫风萧索,云栈萦纡登剑阁。峨嵋山下少人行,旌旗无光日色薄。蜀江水碧蜀山青,圣主朝朝暮暮情。行宫见月伤心色,夜雨闻铃肠断声。天旋地转回龙驭,到此踌躇不能去。马嵬坡下泥土中,不见玉颜空死处。君臣相顾尽沾衣,东望都门信马归。归来池苑皆依旧,太液芙蓉未央柳。芙蓉如面柳如眉,对此如何不泪垂。春风桃李花开日,秋雨梧桐叶落时。西宫南内多秋草,落叶满阶红不扫。梨园弟子白发新,椒房阿监青娥老。夕殿萤飞思悄然,孤灯挑尽未成眠。迟迟钟鼓初长夜,耿耿星河欲曙天。鸳鸯瓦冷霜华重,翡翠衾寒谁与共。悠悠生死别经年,魂魄不曾来入梦。临邛道士鸿都客,能以精诚致魂魄。为感君王辗转思,遂教方士殷勤觅。排空驭气奔如电,升天入地求之遍。上穷碧落下黄泉,两处茫茫皆不见。忽闻海上有仙山,山在虚无缥渺间。楼阁玲珑五云起,其中绰约多仙子。中有一人字太真,雪肤花貌参差是。金阙西厢叩玉扃,转教小玉报双成。闻道汉家天子使,九华帐里梦魂惊。揽衣推枕起徘徊,珠箔银屏迤逦开。云鬓半偏新睡觉,花冠不整下堂来。风吹仙袂飘飘举,犹似霓裳羽衣舞。玉容寂寞泪阑干,梨花一枝春带雨。含情凝睇谢君王,一别音容两渺茫。昭阳殿里恩爱绝,蓬莱宫中日月长。回头下望人寰处,不见长安见尘雾。惟将旧物表深情,钿合金钗寄将去。钗留一股合一扇,钗擘黄金合分钿。但教心似金钿坚,天上人间会相见。临别殷勤重寄词,词中有誓两心知。七月七日长生殿,夜半无人私语时。在天愿作比翼鸟,在地愿为连理枝。天长地久有时尽,此恨绵绵无绝期。
用户头像
levvel发表于 7个月前
人生贵相知,何用金与钱
崔哥发表于 7个月前
终南阴岭秀,积雪浮云端。林表明霁色,城中增暮寒。