SQL:聚合类窗口函数的preceding和following参数用法

您所在的位置:网站首页 sql语句中取整数和小数部分的函数 SQL:聚合类窗口函数的preceding和following参数用法

SQL:聚合类窗口函数的preceding和following参数用法

2023-06-09 14:09| 来源: 网络整理| 查看: 265

目录

partition by 分组字段:

order by 排序字段

rows between 和range between 对比

unbound和current row

窗口函数:函数() over (partition by col1 order by col2)

聚合类窗口函数顾名思义,是指窗口函数中的函数部分为聚合函数,包括:

求和sum()、最大值max()、最小值min()、均值avg()、标准差std()等

这些函数在窗口上的使用规则都是类似的,我们以sum()求和函数为例来看一看

简单的数据示例

studentclassscore11班9021班8032班9642班8552班70 partition by 分组字段:

partition by class 是指在班级内部进行sum()函数统计

partition by不设置,就是指在全部数据范围内进行sum函数统计

studentclassscoresum()over(partition by class )sum()over()11班9017041021班8017041032班9024041042班8024041052班70240410 order by 排序字段

order by score 是指将分数从低到高排序(倒序的话:order by score desc)

studentclassscoresum(score)over(partition by class order by score desc )11班909021班8017032班909042班8017052班70240 rows between 和range between 对比

当数据不重复时,这样写没有问题,但是如果数据重复,就会出现下面的问题

studentclassscoresum(score)over(order by score desc)11班9018032班9018021班8034042班8034052班70410

 因为在排序时,同样是90分和80分的记录无法区分,所以只能全部加入结果。如果想要避免这样的问题就需要引入order by参数中的:

rows between 1 preceding and 2 following

含义:在当前行往前1行,往后2行,一共4行范围内进行计算

range between 1 preceding and 2 following 

含义:在当前行的数值往前1个数值,往后1个数值,进行计算,范围不一定是4行,因为可能会出现重复值

如果是简单的order by col,默认使用的事range between。所以说:如果存在重复值的时候,需要写成rows between。

unbound和current row

其中数值1和2可以替换成任意值,也可以直接使用unbounded和current row ,其中unbounded表示不做限制,current row 表示当前行

rows between unbounded preceding and unbounded following

含义:按照分组内全部行求和,不做任何限制

rows between unbounded preceding and current row

含义:从分组内排序的起始行到当前行

range between unbounded preceding and unbounded following 

含义:按照分组内全部行求和,不做任何限制

range between unbounded preceding and unbounded following 

含义:从分组内排序的起始行的值到当前行的值

由此可知,在上述案例中,如果我们想得到1、2班全部同学成绩从高到低排序的累计求和可以这样写:

sum(score)over (order by score desc rows between unbounded preceding and current row)

具体说明如下:

因为不需要对班级分组,所以partition by class不写order by score desc 表示按分数倒序排序rows between 是因为成绩中存在重复值,使用rows between可以保证和当前行的数值相同的行不会被计算进去unbounded preceding 表示从起始行开始current row 表示到当前行 实用价值

窗口函数的移动(proceding 和following)不仅可以实现上述累加求和的效果,在计算移动平均值的时候也非常有用,可以使用如下写法实现:

avg(求均值字段)over(order by date rows between 3 proceding and current row)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3