分析函数和开窗函数

2023-12-04 20:38
文章标签 分析 函数 开窗

本文主要是介绍分析函数和开窗函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分析函数  分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值分析函数和聚合函数的区别  普通的聚合函数用group by分组,每个分组返回一个统计值  分析函数采用partition by分组,并且每组每行都可以返回一个统计值  显而易见的区别是,从返回结果上看:  聚合后的记录数可能会减少,因为它对数据源进行了group by操作,所以对结果是有影响的,即返回的结果里去掉聚合的列后,跟聚合前的结果不一样  而分析后的记录数是不变的,因为它的作用仅仅在于分析,所以不会对结果有影响,即返回的结果里去掉分析的列后,跟分析前的结果是一样的分析函数的形式  分析函数要与开窗函数(over())一起使用,使用形式为:分析函数() over()开窗函数(over())

  开窗函数(over())包含三个分析子句:    分组子句(partition by)    排序子句(order by)    窗口子句(rows)  开窗函数(over())使用形式如下:    over(partition by xxx order by yyy rows between zzz)  开窗函数里的"窗",即"窗口",表示分析函数分析时要处理的数据范围  比如分析函数sum(),它所针对的数据范围为窗口中的记录,而不是整个表的记录  要获取某个范围的sum值,则需在窗口指定具体的数据范围  比如指定该窗口从该分组中的第一行到最后一行,那么该组中的每一个sum值都会一样,即整个组的总和  窗口子句除了rows方式的窗口,还包括range方式和滑动窗口

  排序子句(order by)

    排序子句的使用方法跟sql中的order by一样,如:order by colA desc, colB asc nulls first, colC  nulls last    开窗函数的order by和sql语句的order by的执行时机      分析及开窗函数是在整个sql查询结束后再进行的, 即sql语句的order by也会影响分析函数的执行结果,有以下两种情况:        1) 两者一致,即sql语句中的order by语句与开窗函数的order by一致,则sql语句中的order by先执行,分析函数在分析时就不必再排序        2) 两者不一致,即sql语句中的order by语句与开窗函数的order by不一致,则分析及开窗函数先分析排序,sql语句中的order by再最后执行

  窗口子句(rows)    如果没有窗口子句(rows),则默认当前组的第一行到当前行    无论是否省略分组子句,都有:      窗口子句(rows)不能单独存在,必须有order by子句时才能出现      相反,有order by子句,可以没有窗口子句(rows)

    当省略窗口子句时      如果存在order by,则默认的窗口是unbounded preceding and current row,即当前组的第一行到当前行      如果不存在order by,则默认的窗口是unbounded preceding and unbounded following,即整个组    例如:lag(sal) over(order by sal)    over(order by salary)表示意义如下:      1) 由于省略分组子句,所以当前组的范围为整个表的数据行      2) 在当前组(此时为整个表的数据行)这个范围里执行排序,即order by salary      3) 分析函数lag(sal)在当前组(此时为整个表的数据行)这个范围里的窗口范围为当前组的第一行到当前行,即分析函数lag(sal)在这个窗口范围执行

    窗口子句(rows)的相关关键字:    preceding:表示在...之前      1 preceding:表示当前记录的前1条记录      2 preceding:表示当前记录的前2条记录      n preceding:表示当前记录的前n条记录      unbounded preceding:不受控制的,无限的,                   若无分组,则表示所有记录的第1条记录                   若有分组,则表示分组后,组内的第1条记录    following:表示在...之后      1 following:表示当前记录的后一条记录      2 following:表示当前记录的后两条记录      n following:表示当前记录的后n条记录      unbounded following:不受控制的,无限的,                若无分组,则表示所有记录的最后一条记录                若有分组,则表示分组后,组内的最后一条记录    相关用例:      rows between unbounded preceding and unbounded following:针对所有记录      rows between unbounded preceding and current row:针对第一条记录到当前记录      rows between current row and unbounded following:针对当前记录到最后一条记录      rows between 1 preceding and current row:针对当前记录的上一行记录到当前行记录      rows between current row and 3 following:针对当前记录到当前行记录的后三条记录      rows between 1 preceding and 2 following:针对当前记录的上一条记录 ~~ 当前行记录的后两条记录    当开窗函数over()出现分组(partition by)子句时      unbounded preceding即表中一个分组里的第一行,unbounded following即表中一个分组里的最后一行    当开窗函数over()省略了分组(partition by)子句时       unbounded preceding即表中的第一行, unbounded following即表中的最后一行

    使用示例:

select t.id,t.name,t.city,t.sales,--按城市分组,且组内销量升序排列,并获取当前记录针对上一条记录到下一条记录范围内的最小销量值min(t.sales) over(partition by t.city order by t.sales rows between 1 preceding and 1 following) as col1,--按城市分组,且组内销量升序排列,并获取当前记录针对第一条记录到当前记录范围内的最小销量值min(t.sales) over(partition by t.city order by t.sales rows between unbounded preceding and current row) as col2,--按城市分组,且组内销量升序排列,并获取当前记录针对上三条记录到当前记录范围内的最小销量值min(t.sales) over(partition by t.city order by t.sales rows between 3 preceding and current row) as col3
from dataset t

这篇关于分析函数和开窗函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/454835

相关文章

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以