​​​​​​​Oracle11 分析函数等高级函数使用说明

news2024/12/22 16:13:05

1、Group by

与GROUP BY 一起使用的关建字 GROUPING , ROLLUP,CUBE,结合这些特性的函数可以实现SQL的明细+分组统计


GROUPING 记录是对哪个字段进行统计
select  deptno,job,sum(sal),grouping(deptno),grouping(job) from emp  group by  rollup( deptno,job);

等价于

select deptno,job,sum(sal) from emp group by deptno,job

union all

select deptno,null,sum(sal) from emp group by deptno

union all

select null,null,sum(sal) from emp ;


关建字 CUBE

select  deptno,job,sum(sal),grouping (deptno),grouping(job) from emp  group by    cube( deptno,job);

 等价于

select deptno,job,sum(sal) from emp group by deptno,job

union all

select deptno,null,sum(sal) from emp group by deptno

union all

select null,null,sum(sal) from emp

union all

select null,job,sum(sal) from emp group by job

关建字 GROUP SETS  指定聚合方式

select  deptno,job,sum(sal),grouping (deptno),grouping(job) from emp  group by   grouping sets(deptno,job,null) ;

select  deptno,job,sum(sal),grouping (deptno),grouping(job) from emp  group by   grouping sets((deptno,job),null) ;

2、Connect by

CONNECT BY 语句特有的函数

SYS_CONNECT_BY_PATH   获取节点在整个树结构的路径

CONNECT_BY_ROOT,      获取节点规属的根节点

CONNECT_BY_ISLEAF,      判断该节点是否存在子节点

CONNECT_BY_ISCYCLE     该节点是否循环

LEVEL 伪列,用来指定节点在树结构里的层次

对 CONNECT BY 的结果集的每层进行排序

SELECT ……. FROM  TABLENAME

CONNECT BY PRIOR ID = F_ID

START WITH F_ID = 0

ORDER SIBLINGS BY ID DESC


无限记录的语句
select  level from dual connect by 1=1
显示20个记录结果集
select  level from dual connect by 1=1 and level<=20

显示一个树结构层次的
select  lpad(' ',(level-1)*10,' ')||ename,level from emp  connect by prior  empno=mgr  start with mgr is null


理解以下语句的执行
select  * from emp where empno=7369 connect by    empno=empno  ;

select * from emp  where empno=7369 connect by empno=empno and sys_guid() is not  null;

select * from emp  where empno=7369 connect by empno=empno and sys_guid() is    null;

select  * from emp where empno=7369 connect by prior   empno=empno;

select  * from emp where empno=7369 connect by prior   empno=empno and prior sys_guid() is null;

select  * from emp where empno=7369 connect by prior   empno=empno and   sys_guid() is null;

select  * from emp where empno=7369 connect by prior   empno=empno and prior sys_guid() is not null;

3、分析函数

关建字     分析函数 OVER (PARTITION BY …… ORDER BY ……)

PARTITION BY 分组

ORDER BY    排序

ROW_NUMBER :返回有序组中一行的偏移量,从而可用于按特定标准排序的行号,排行值相同,也是显示不间断流水号

RANK  :根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置, 如果排序值相同,rank()值相同

DENSE_RANK :根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置, 与rank相似,只是不会跳号

SUM       :该函数计算组中表达式的累积和

MIN       :在一个组中的数据窗口中查找表达式的最小值

MAX       :在一个组中的数据窗口中查找表达式的最大值

AVG        :用于计算一个组和数据窗口内表达式的平均值。

COUNT     :对一组内发生的事情进行累积计数

FIRST      :从DENSE_RANK返回的集合中取出排在最前面的一个值的行

LAST      :从DENSE_RANK返回的集合中取出排在最后面的一个值的行

FIRST_VALUE :返回组中数据窗口的第一个值

LAST_VALUE  :返回组中数据窗口的最后一个值。

LAG         :可以访问结果集中的其它行而不用进行自连接

LEAD         :LEAD与LAG相反,LEAD可以访问组中当前行之后的行

例:

select empno,sal,

       row_number() over(order by sal) x,

       rank()       over(order by sal) y,

       dense_rank() over(order by sal) z

from emp where deptno=30;


select empno,ename,sal,deptno,

       row_number() over(partition by deptno order by sal) x,

       rank()       over(partition by deptno order by sal) y,

       dense_rank() over(partition by deptno order by sal) z

from emp;
 

执行以下SQL,看看查询后的结果集

1.

select empno, ename, deptno, sal,

       sum(sal) over (partition by deptno order by ename) x

from emp;  

--注意PARTITION BY, ORDER BY

2.

select empno, ename, deptno, sal,

       sum(sal) over (partition by deptno order by ename

                      rows between unbounded preceding and current row) x

from emp;  

--注意ROWS BETWEEN unbounded preceding AND current row  

--是指第一行至当前行的汇总 

3.

select empno, ename, deptno, sal,

       sum(sal) over (partition by deptno order by ename

                      rows between current row and unbounded following) x

from emp;  

--注意ROWS BETWEEN current row AND unbounded following  

--是指当前行到最后一行的汇总 

4.

select empno, ename, deptno, sal,

       sum(sal) over (partition by deptno order by ename

                      rows between 1 preceding and current row) x

from emp;  

--注意ROWS BETWEEN 1 preceding AND current row

--是指当前行的上一行(rownum-1)到当前行的汇总 

5.

select empno, ename, deptno, sal,

       sum(sal) over (partition by deptno order by ename

                      rows between 1 preceding and 2 following) x

from emp;  

--注意ROWS BETWEEN 1 preceding AND 1 following

--是指当前行的上一行(rownum-1)到当前行的下辆行(rownum+2)的汇总

4、Model

这个函数一般不太常见,但确是非常有用的一个函数
具体的官方资料可以参考

noname.htm

语法定义如下

--MODEL:MODEL语句的关键字,必须。

--DIMENSION BY: DIMENSION维度的意思,必须。

--MEASURES:指定作为数组的列,可以定义出许多有规则的伪列

--RULES:对数组的各列进行各种操作规则的定义。


 

执行以下SQL,看看结果集,理解model 函数

with t as (select  deptno,to_char(emp.hiredate,'yyyy') year,sum(sal) sal from emp group by deptno,to_char(emp.hiredate,'yyyy'))

select deptno,year,sal,p_sal

from t

model

dimension by (deptno,year)

measures (sal,0 p_sal)

rules

(

p_sal[any,any]=sal[cv(),cv(year)-1]

);

select   ename,sales,xxx from emp

model

dimension by (ename)

measures (sal sales,0 xxx)

rules

(

xxx[any]=sum(sales)[ cv(ename)='CLARK' AND (ename)='CLARK']

);

select   ename,sales,xxx from emp

model

dimension by (ename)

measures (sal sales,0 xxx)

rules

(

xxx[any]= sales[ ename='SMITH']

);

select   ename,sales,xxx from emp

model

dimension by (ename)

measures (sal sales,0 xxx)

rules

(

xxx[any]= sum(sales)[ cv(ename)='SMITH']

);

select   ename,sales,xxx from emp

model

dimension by (ename)

measures (sal sales,0 xxx)

rules

(

xxx[any]= sum(sales)[ cv(ename)='SMITH']

);

///

比较这两个SQL的结果

with t as (select  deptno,to_char(emp.hiredate,'yyyy') year,sum(sal) sal from emp group by deptno,to_char(emp.hiredate,'yyyy'))

select deptno,year,sal,p_sal

from t

model

dimension by (deptno,year)

measures (sal,0 p_sal)

rules

(

p_sal[any,any]=sum(sal)[cv(),cv() is not null ]

);

with t as (select  deptno,to_char(emp.hiredate,'yyyy') year,sum(sal) sal from emp group by deptno,to_char(emp.hiredate,'yyyy'))

select deptno,year,sal,p_sal

from t

model

dimension by (deptno,year)

measures (sal,0 p_sal)

rules

(

p_sal[any,any]=sum(sal)[any,cv() is not null ]

);

5、Listagg与自定义聚合函数


Listagg 函数是11g以上才出现的,针对行转列的函数(10g不支持改函数)

listagg函数的语法结构如下:
LISTAGG( [,]) WITHIN GROUP (ORDER BY ) [OVER (PARTITION BY )]

listagg虽然是聚合函数,但可以提供分析功能(比如可选的OVER()子句)。使用listagg中,下列中的元素是必须的:1>需要聚合的列或者表达式  2>WITHIN GROUP 关键词 3>分组中的ORDER BY子句

select deptno, listagg(ename, ',') within group(order by null)

  from emp

 group by deptno;

另外介绍一个 相对listagg 这个函数  的行转列的函数 regexp_string

 select regexp_substr('ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD',

                     '[^,]+',

                     1,

                     level)

  from dual

connect by regexp_count('ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD', '[^,]+') >=

           level

在不支持regexp_count的数据库环境下,可以使用 length ,  replace 这两个函数来实现它的效果

针对 11g以下的数据库,不能使用 listagg这个函数,可以进行自定义聚合函数来替代此函数

oracle自定义聚集函数接口简介

   a. static function ODCIAggregateInitialize(sctx IN OUTstring_agg_type) return number

   自定义聚集函数初始化设置,从这儿开始一个聚集函数

   b. member function ODCIAggregateIterate(self IN OUT string_agg_type ,value IN varchar2)  return number

    自定义聚集函数,最主要的步骤,这个函数定义我们的聚集函数具体做什么操作,后面的例子,是取最大值,最小值,平均值,还是做连接操作.self 为当前聚集函数的指针,用来与前面的计算结果进行关联

   c. member function ODCIAggregateMerge (self IN string_agg_type,returnValue OUT  varchar2,flags IN number)  return number

     用来合并两个聚集函数的两个不同的指针对应的结果,用户合并不同结果结的数据,特别是处理并行(parallel)查询聚集函数的时候.

    d. member function OCDIAggregateTerminate(self IN string_agg_type,returnValue OUT varchar2,flags IN number) return number

     终止聚集函数的处理,返回聚集函数处理的结果.

下面代码 是实现 listagg 函数效果的 自定义函数

实现效果如下图所示

实现代码如下:

create or replace type cux_listagg as object (

    --定义变量

    result_string varchar2(4000),

    --自定义聚集函数初始化设置,从这儿开始一个聚集函数

    static function ODCIAggregateInitialize(cs_ctx In Out cux_listagg) return number,

    --自定义聚集函数,最主要的步骤,这个函数定义我们的聚集函数具体做什么操作,后面的例子,是取最大值,最小值,平均值,还是做连接操作

    --self 为当前聚集函数的指针,用来与前面的计算结果进行关联

    member function ODCIAggregateIterate(self In Out cux_listagg,value in varchar2) return number,

    -- 用来合并两个聚集函数的两个不同的指针对应的结果,用户合并不同结果结的数据,特别是处理并行(parallel)查询聚集函数的时候.

    member function ODCIAggregateMerge(self In Out cux_listagg,ctx2 In Out cux_listagg) return number,

    --终止聚集函数的处理,返回聚集函数处理的结果.

    member function ODCIAggregateTerminate(self In Out cux_listagg,returnValue Out varchar2,flags in number) return number

)

/

create or replace type body cux_listagg is

  --自定义聚集函数初始化设置,从这儿开始一个聚集函数

  static function ODCIAggregateInitialize(cs_ctx IN OUT cux_listagg) return number

  is

  begin

      cs_ctx := cux_listagg(null);

      return ODCIConst.Success;

  end;

    --自定义聚集函数,最主要的步骤,这个函数定义我们的聚集函数具体做什么操作,后面的例子,是取最大值,最小值,平均值,还是做连接操作

    --self 为当前聚集函数的指针,用来与前面的计算结果进行关联

  member function ODCIAggregateIterate(self IN OUT cux_listagg,

                                       value IN varchar2 )

  return number

  is

  begin

      self.result_string := self.result_string || ','|| value;

      return ODCIConst.Success;

  end;

 --终止聚集函数的处理,返回聚集函数处理的结果.

  member function ODCIAggregateTerminate(self IN Out cux_listagg,

                                         returnValue OUT varchar2,

                                         flags IN number)

  return number

  is

  begin

      returnValue := ltrim(rtrim(self.result_string,','),',');

      return ODCIConst.Success;

  end;

-- 用来合并两个聚集函数的两个不同的指针对应的结果,用户合并不同结果结的数据,特别是处理并行(parallel)查询聚集函数的时候.

    

  member function ODCIAggregateMerge(self IN OUT cux_listagg,

                                     ctx2 IN Out cux_listagg)

  return number

  is

  begin

      self.result_string := self.result_string || ',' || ctx2.result_string;

      return ODCIConst.Success;

  end;

end;

/

再对这个type进行函数的创建

CREATE or replace

FUNCTION f_row_column(input varchar2 )

RETURN varchar2

PARALLEL_ENABLE AGGREGATE USING cux_listagg;

/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2130003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

并发编程 - GCD信号量

引言 在现代应用开发中&#xff0c;处理并发任务已经成了不可避免的挑战。在这种情况下&#xff0c;如何有效地管理多个线程对共享资源的访问&#xff0c;避免资源竞争和数据不一致的问题&#xff0c;成为了我们必须面对的难题。在NSOperation&NSOperationQueue中系统为我…

OpenCV结构分析与形状描述符(21)计算包围给定点集的最小面积三角形函数minEnclosingTriangle()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 找到一个包围二维点集的最小面积三角形&#xff0c;并返回其面积。 该函数找到一个包围给定的二维点集的最小面积三角形&#xff0c;并返回其面…

【HarmonyOS】云开发-云数据库(二)

背景 书接上回&#xff0c;实现了云侧和端侧的云数据库创建、更新、修改等操作。这篇文章实现调用云函数对云数据库进行增删改查。 CloudProgram 项目配置 新建函数 在cloudfunctions目录下点击右键&#xff0c;选择新建Cloud Function&#xff0c;输入query-student-functi…

使用OpenCV进行模糊检测(拉普拉斯算子)

参考&#xff1a; 使用OpenCV进行模糊检测&#xff08;拉普拉斯算子&#xff09; 代码&#xff1a; # import the necessary packages from imutils import paths import argparse import cv2 import osdef variance_of_laplacian(image):# compute the Laplacian of the ima…

聚观早报 | 极越07正式上市;宝骏云海正式上市

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 9月12日消息 极越07正式上市 宝骏云海正式上市 滴滴包车全国上线 淘宝Apple Vision Pro版重大更新 OpenAI将发布…

【中秋月饼系列】2024年立体月饼新鲜出炉----python画月饼(1)附完整代码

【中秋月饼系列】2024年立体月饼新鲜出炉 ----python画月饼&#xff08;1&#xff09;附完整代码 本文目录&#xff1a; 零、时光宝盒 一、2024年中秋节立体逼真月饼&#xff08;效果展示&#xff09; 二、Python 海龟画图主要方法 &#xff08;1&#xff09;海龟画图的主…

【Linux】:信号的保存和信号处理

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来信号的保存和信号处理相关代码和知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入…

SpringBoot + MySQL + MyBatis 实操示例教学

一、准备工作 1.导入相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><…

网络安全实训十(Windows提权、UAC绕过、Linux利用suid提权)

一、Windows提权 1 手动查找系统存在漏洞 使用命令查看安装的补丁信息 systeminfo wmic qfe get caption,description,hotfixid,installedon 2 自动查找系统存在漏洞 2.1 Windows Exploit Suggester 2.1.1 下载脚本 下载地址&#xff1a;https://github.com/AonCyberLabs/Wi…

【有啥问啥】深入解析3A算法:自动对焦、自动曝光与自动白平衡的原理、实现与应用

深入解析3A算法&#xff1a;自动对焦、自动曝光与自动白平衡的原理、实现与应用 在现代图像处理技术中&#xff0c;3A算法&#xff08;自动对焦、自动曝光、自动白平衡&#xff09;是数码摄像设备核心的成像控制系统&#xff0c;负责调节图像的清晰度、亮度和色彩平衡。这些算…

《深度学习》—— 神经网络基本结构

前言 深度学习是一种基于神经网络的机器学习算法&#xff0c;其核心在于构建由多层神经元组成的人工神经网络&#xff0c;这些层次能够捕捉数据中的复杂结构和抽象特征。神经网络通过调整连接各层的权重&#xff0c;从大量数据中自动学习并提取特征&#xff0c;进而实现预测或…

Aigtek功率放大器的工作状态和技术指标有哪些

功率放大器是电子电路中的重要组成部分&#xff0c;用于放大电信号的功率&#xff0c;以便驱动负载&#xff0c;如扬声器、天线或电动机。它在各种应用中都起到至关重要的作用&#xff0c;从音响系统到通信设备&#xff0c;以下是功率放大器的工作状态和技术指标的详细介绍。 工…

利用zabbix监控ogg进程(Windows平台)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Boost.pyhon 使用方法

哈哈,又是一个相当nice的技巧 boost 在使用时定义使用静态库 很完整的功能 方法实现如上,很多时候写python脚本直接执行还是最容易的,编译打包还是比较麻烦,内置解释器到QT C的代码中 加载python脚本时,从python 脚本中获取值&#xff0c;在C 中进行计算使用 在python 和 C 的交…

OLED显示屏应用(STM32)

一、接线 OLED的四针脚对应接法如下图 GND——GND 3.3V——3.3V SCL——PB8 SDA——PB9 二、OLED.c代码介绍 #include "stm32f10x.h" #include "OLED_Font.h"/*引脚配置*/ //OLED时钟线 //GPIOB8接时钟线接口 //定义一个函数&#xff0c;函数的参数为…

【JavaScript】LeetCode:31-35

文章目录 31 反转链表32 回文链表33 环形链表34 环形链表Ⅱ35 合并两个有序链表 31 反转链表 初始化&#xff1a;cur head&#xff0c;pre null。pre和cur一起向前移。由于反转链表时&#xff0c;cur.next指向pre&#xff0c;导致cur在下次循环中就找不到了原来的cur.next&am…

牛客思维题———进制(简单)

C-小红的双好数&#xff08;easy&#xff09;_牛客周赛 Round 57 (nowcoder.com) 思路&#xff1a; 任何一个数n可以表示为n进制&#xff0c;且值为1 特判1 2 即可 代码&#xff1a; #include<bits/stdc.h> #define int long long using namespace std;#define IOS i…

Java设计模式—面向对象设计原则(一) ----->开闭原则OCP(完整详解,附有代码+案例)

3.1开闭原则 对扩展开放&#xff0c;对修改关闭。在程序需要进行拓展的时候&#xff0c;不能去修改原有的代码&#xff0c;实现一个热插拔的效果。简言之&#xff0c;是为了使程序的扩展性好&#xff0c;易于维护和升级。想要达到这样的效果&#xff0c;我们需要使用接口和抽象…

【黑金系】金融UI/UX体验设计师面试作品集 Figma源文件分享

在数字金融时代&#xff0c;UI/UX体验设计师扮演着至关重要的角色。他们不仅塑造着产品的界面&#xff0c;更引领着用户的使用体验。我们的面试作品集&#xff0c;正是这样一部展现金融UI/UX设计魅力的宝典。 这套作品集汇聚了众多经典案例&#xff0c;每一处设计都经过精心雕…

docker部署bind9

一、部署 ## docker 部署bind9# docker run -d --name bind9 --restartalways --publish 53:53/tcp --publish 53:53/udp --publish 10000:10000/tcp --volume /data/docker/dns-server:/data --env ROOT_PASSWORDroot dhub.kubesre.xyz/sameersbn/bind:9.16.1-20200524# 建数…