分析函数

本文深入解析了SQL分析函数的语法及应用,包括LAST_VALUE、SUM等函数的使用方法,展示了如何通过PARTITION BY、ORDER BY和ROWS BETWEEN子句进行数据分组、排序和窗口定义。通过具体实例,如计算部门最高薪资、累计薪资等,帮助读者掌握分析函数在实际场景中的灵活运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL 分析函数汇总

一、分析函数语法

function_name(<argument>,<argument>...) over(<partition_Clause><order by_Clause><windowing_Clause>);1

function_name():函数名称

argument:参数

over( ):开窗函数

partition_Clause:分区子句,数据记录集分组,group by…

order by_Clause:排序子句,数据记录集排序,order by…

windowing_Clause:开窗子句,定义分析函数在操作行的集合,三种开窗方式:rows、range、Specifying

注:使用开窗子句时一定要有排序子句!!!

分析函数实例

SELECT e.*, LAST_VALUE(E.SAL) OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_SAL FROM scott.EMP E

(RANK() OVER(ORDER BY paymoney DESC)) / (COUNT(1)OVER()

max(t.salary) keep(dense_rank first order by t.bonus + t.salary, mod(t.bonus, 2), t.bonus / t.salary nulls last) over()

二、分析函数汇总

oracle 分析函数实例(在scott用户下模拟

在线oracle数据库

https://www.oracle.com/technetwork/cn/database/application-development/livesql/index.html

--显示各部门员工的工资,并附带显示该部分的最高工资。
SELECT E.DEPTNO,
       E.EMPNO,
       E.ENAME,
       E.SAL,
       LAST_VALUE(E.SAL) 
       OVER(PARTITION BY E.DEPTNO 
            ORDER BY E.SAL ROWS 
            --unbounded preceding and unbouned following 表中的所有记录
            --unbounded:不受控制的,无限的
            --preceding:在...之前
            --following:在...之后
            BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_SAL
  FROM scott.EMP E;

运行结果:

DEPTNOEMPNOENAMESALMAX_SAL
107934MILLER13005000
107782CLARK24505000
107839KING50005000
207369SMITH8003000
207876ADAMS11003000
207566JONES29753000
207788SCOTT30003000
207902FORD30003000
307900JAMES9502850
307654MARTIN12502850
307521WARD12502850
307844TURNER15002850
307499ALLEN16002850
307698BLAKE28502850

按照deptno分组,然后计算每组值的总和

SELECT EMPNO,
       ENAME,
       DEPTNO,
       SAL,
       SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY ENAME) max_sal
  FROM SCOTT.EMP;

运行结果:

EMPNOENAMEDEPTNOSALMAX_SAL
7782CLARK1024502450
7839KING1050007450
7934MILLER1013008750
7876ADAMS2011001100
7902FORD2030004100
7566JONES2029757075
7788SCOTT20300010075
7369SMITH2080010875
7499ALLEN3016001600
7698BLAKE3028504450
7900JAMES309505400
7654MARTIN3012506650
7844TURNER3015008150
7521WARD3012509400

对各部门进行分组,并附带显示第一行至当前行的汇总

SELECT EMPNO,
       ENAME,
       DEPTNO,
       SAL,
       --注意ROWS BETWEEN unbounded preceding AND current row  是指第一行至当前行的汇总
       SUM(SAL) OVER(PARTITION BY DEPTNO 
                     ORDER BY ENAME 
                     ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) max_sal
  FROM SCOTT.EMP;

运行结果:

EMPNOENAMEDEPTNOSALMAX_SAL
7782CLARK1024502450
7839KING1050007450
7934MILLER1013008750
7876ADAMS2011001100
7902FORD2030004100
7566JONES2029757075
7788SCOTT20300010075
7369SMITH2080010875
7499ALLEN3016001600
7698BLAKE3028504450
7900JAMES309505400
7654MARTIN3012506650
7844TURNER3015008150
7521WARD3012509400

当前行至最后一行的汇总

SELECT EMPNO,
       ENAME,
       DEPTNO,
       SAL,
       --注意ROWS BETWEEN current row AND unbounded following 指当前行到最后一行的汇总
       SUM(SAL) OVER(PARTITION BY DEPTNO 
                     ORDER BY ENAME 
                     ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) max_sal
  FROM SCOTT.EMP;

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

SELECT EMPNO,
       ENAME,
       DEPTNO,
       SAL,
       --注意ROWS BETWEEN 1 preceding AND current row 指当前行的上一行(rownum-1)到当前行的汇总 
       SUM(SAL) OVER(PARTITION BY DEPTNO 
                     ORDER BY ENAME ROWS 
                     BETWEEN 1 PRECEDING AND CURRENT ROW) max_sal
  FROM SCOTT.EMP;

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

SELECT EMPNO,
       ENAME,
       DEPTNO,
       SAL,
       --注意ROWS BETWEEN 1 preceding AND 1 following 是指当前行的上一行(rownum-1)到当前行的下辆行(rownum+2)的汇总
       SUM(SAL) OVER(PARTITION BY DEPTNO 
                     ORDER BY ENAME 
                     ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING) max_sal
  FROM SCOTT.EMP

分析函数包含三个分析子句:分组(partition by), 排序(order by), 窗口(rows)

窗口子句中我们经常用到指定第一行,当前行,最后一行这样的三个属性

第一行是 unbounded preceding

当前行是 current row

最后一行是 unbounded following

窗口子句不能单独出现,必须有order by子句时才能出现

当省略窗口子句时:
a) 如果存在order by则默认的窗口是unbounded preceding and current row --当前组的第一行到当前行

b) 如果同时省略order by则默认的窗口是unbounded preceding and unbounded following --整个组

如果省略分组,则把全部记录当成一个组:
a) 如果存在order by则默认窗口是unbounded preceding and current row --当前组的第一行到当前行
b) 如果这时省略order by则窗口默认为unbounded preceding and unbounded following --整个组

min | max(column1) keep (dense_rank first | last order by column2) over (partition by column3)

dense_rank first,dense_rank last为keep 函数的保留属性,表示分组、排序结果集中第一个、最后一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值