SQL分析利器:OVER() 函数如何为每行数据定制计算

在这里插入图片描述

Oracle 分析函数 OVER()

OVER() 是 Oracle 从 8.1.6 版本开始提供的一个强大分析函数,用于解决复杂报表统计需求。它允许在数据分组后,基于每个组内的某种统计值对每一行返回一个结果值。与传统的聚合函数不同,OVER() 函数能让每行数据返回一个计算结果,而不需要整组数据进行聚合计算。

1. OVER() 分析函数语法

OVER() 函数的基本语法结构如下:

FUNCTION_NAME(<参数>, ...) 
OVER (
    <PARTITION BY 表达式, ...> 
    <ORDER BY 表达式 ASC/DESC NULLS FIRST/LAST> 
    <WINDOWING 子句>
)
语法解析:
  • FUNCTION_NAME(<参数>, ...): 用于指定要与 OVER() 函数结合使用的分析函数。常见的分析函数包括 RANK()DENSE_RANK()ROW_NUMBER()NTILE()LAG()LEAD() 以及聚合函数 SUM()AVG()MIN()MAX()COUNT() 等。

  • PARTITION BY 表达式: 类似于 GROUP BY,用于对数据进行分区。每个分区将独立进行函数计算。

  • ORDER BY 表达式 ASC/DESC NULLS FIRST/LAST: 指定在每个分区内的数据排序方式。ASC 表示升序,DESC 表示降序。NULLS FIRSTNULL 值放在前面,NULLS LASTNULL 值放在最后。

  • WINDOWING 子句: 用于定义数据窗口的范围。常见的写法有 ROWS BETWEENRANGE BETWEEN,分别定义窗口的起止范围。

2. 窗口子句 WINDOWING 示例

WINDOWING 子句用于指定每行对应的窗口数据范围,即当前行在哪些数据范围内进行计算。例如:

  • ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING: 当前行的上1行和下2行,共计4行。
  • ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING: 当前行和其后的2行,共计3行。
  • RANGE BETWEEN CURRENT ROW AND 50 FOLLOWING: 当前行开始,后面50个范围内的行。
  • RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING: 当前行开始,前50和后150个范围内的行。

3. OVER() 函数常见搭配使用

  • RANK()DENSE_RANK()ROW_NUMBER():用于为分区中的每行计算排名。
  • NTILE():将数据分为指定的组数,并返回每行所属的组号。
  • LAG()LEAD():分别用于访问当前行之前或之后的行数据。
  • 聚合函数:如 SUM()AVG()MIN()MAX()COUNT(),它们也可以与 OVER() 搭配使用,但 ORDER BY 子句可以省略。

示例说明

有一个员工表 emp,使用 OVER() 分析函数计算每个部门的员工工资总和和排名:

SELECT 
    empno, 
    deptno, 
    sal, 
    SUM(sal) OVER (PARTITION BY deptno) AS dept_sal_sum, 
    RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) AS sal_rank 
FROM emp;
  • SUM(sal) OVER (PARTITION BY deptno):计算每个部门的工资总和。
  • RANK() OVER (PARTITION BY deptno ORDER BY sal DESC):按工资从高到低对每个部门的员工排名。

非常感谢您读到这里!如果您觉得这篇文章对您有帮助,可以关注一下博主。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库,容器等)技术,以及更多实用的技能干货。

提供丰富的学习资源和实践经验,让你快速掌握AI技能;提供最新的行业动态和应用案例,帮助你在AI领域脱颖而出。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周同学的技术栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值