×

开窗函数

开窗函数(oracle开窗函数)

admin admin 发表于2023-04-11 18:59:09 浏览62 评论0

抢沙发发表评论

本文目录一览:

开窗函数

over在聚合函数中的使用:

一般格式:

聚合函数名(列) over(选项)

over必须与聚合函数或排序函数一起使用,聚合函数为:

sum(),max(),min(),count(),avg()

排序函数为:

rank(),row_number(),dense_rank(),ntile()

over表示把函数当成开窗函数而不是聚合函数,SQL标准允许将所有聚合函数用做开窗函数,使用over关键字来区分这两种用法。

开窗函数不需要使用group by就可以对数据进行分组,就可以同时返回基础行的列和聚合列。

开窗函数sum(*) over(),对于查询结果的每一行都返回所有符合条件的行的条数,over关键字后的括号中还经常添加选项来改变进行聚合运算的窗口范围,如果over关键字后的括号中选项为空,则开窗函数会对结果集中的所有行进行聚合运算。-开窗函数

常用格式:

sum(*) over(partition by A order by B)

partition by:进行分组,得到对应组内的所有求和值

order by:按照B进行排序,得到对应组内的累计求和值(如果B为id,两个id相同,则这两个id返回的sum那一列是相同的聚合值,是累计到最后一个id对应值的和--下面的例子会详细说明)

order by 字段名 rows|range between 边界规则1 and 边界规则2

rows:表示按照行的范围进行范围的定位

range:表示按照取值的范围进行范围的定位

这两种不同的定位方式主要用来处理并列排序的情况(见下面的例子)

边界规则的可取值为:

current row--当前行

n preceding--前n行

unbounded preceding--一直到第一条记录

n following--后n行

unbounded following--一直到最后一条记录

'range/rows between 边界规则1 and 边界规则2':用来定位聚合计算范围,被称为定位框架。

eg:

1、建表

2、插入数据

3、关于partition by

(1)所属城市的人员数-按城市进行分组聚合

(2)显示每一个人员的信息、所属城市的人员数以及同龄人的人数

在同一个SELECT语句中可以同时使用多个开窗函数,而且这些开窗函数并不会相互干扰。

4、关于order by的详解:

(1)查询从第一行到当前行的的工资总和

(2)将上面的row换成range

结果和(1)的区别体现在红框和黄框部分,按照FSalary进行排序,row-按照行的范围进行范围定位,所以每一行后面对应的‘到当前行工资求和’都不一样,都严格的是第一行到当前行的累计和;range-按照取值的范围进行范围定位,虽然定位框架的语法仍然是从第一行到当前行的累计和,但是由于取值的范围:等于2000元的工资有3人,所以计算的累计为从第一条到2000元工资的最后一个人,写在每个2000元工资的人的后面都是7000。-开窗函数

(3)将(2)中的定位框架省略

上述框架是开窗函数中最常用的定位框架,如果是这种框架的话,可以省略上述定位框架部分

得到的结果和(2)的结果一样。

(4)将上面的sum()换成count(),计算工资排名

按照salary进行排序,然后计算从第一行(unbounded preceding)到当前行(current row)的人员的个数,相当于计算人员的的工资水平排名。

Question:

怎么让工资为2000元的排名都为2?--见后面排序函数的rank()和dence_rank()

5、关于over(partition by A order by B)

over在排序函数中的使用:

一般格式:

排序函数(列) over(选项)

排序函数为:

rank(),dense_rank(),row_number(),ntile(),lead(),lag()

1、rank(),dense_rank(),row_number()的区别

rank()与dense_rank()的区别:

两者都是计算一组数值中的排序值,

但是在有并列关系时,dence_rank中相关等级不会跳过,rank则跳过。

rank() 是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)

dense_rank()是连续排序,有两个第二名时仍然跟着第三名。

row_number():

row_number over(partition by A order by B)

根据A分组,在分组内根据B排序,且得出来的值是每组内部排序后的顺序编号(组内连续的唯一的)

其主要是‘行’的信息,并没有排名。row_number()必须与order by一起使用,

多用于分页查询,比如查询10-100个学生。

2、ntile(x)--平均分区函数

3、lag() over(partition by A order by B)

lead() over(partition by A order by B)

lag和lead中有三个参数,lag('列名',offset,'超出记录窗口时的默认值')

lag和lead可以获取,按一定顺序B排列的当前行的上下相邻若干offset的莫隔行的某个列。

lag()是向前,lead()是向后。

参考

开窗函数是什么?

开窗函数/分析函数:over()

开窗函数也叫分析函数,有两类:一类是聚合开窗函数,一类是排序开窗函数。

开窗函数和row_number()

窗口函数的引入是为了解决 想要既显示聚集前的数据,又要显示聚集后的数据。

开窗函数对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。

over() 按所有行进行分组

over(partition by xxx) 按xxx分组的所有行进行分组

over(partition by xxx order by aaa) 按xxx分组,按列aaa排序 的按到当前行(含当前行)进行分组

over前可以加聚合函数 例如sum count avg min max等

over前也可以加 first_value last_value等

windows 字句 用来制定累加的方式

rank() over等的用法

参考资料:

1、LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值

2、LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值

3、FIRST_VALUE(column)取分组内排序后,截止到当前行,第一个值

4、LAST_VALUE(column)取分组内排序后,截止到当前行,最后一个值

5、row_number() 分组排序功能,row_number()从1开始,为每一条分组记录返回一个数字 (在row_number中排序的时候,可以通过NULLS LAST、NULLS FIRST来控制有NULL的输出)-开窗函数

这里LAG、LEAD统计窗口内往上或者往下第N行值的情况 是基于自己当前行去做的操作

参考资料:

ROW_NUMBER() OVER()函数用来为每条记录返回一个行号,可以用来对记录进行排序并返回该序号,序号从1开始排序

over()是聚集函数,可以给记录进行分组、排序;row_number()不能单独使用,必须搭配over()才能使用

比如示例

如果需要随便添加一个序号的话 可以使用 row_number() over()

如果需要排序分组的话 在over 中添加想要分组或者排序的字段