分析函数和开窗函数

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 panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数