当前位置: 首页 > ds >正文

Oracle高级语法篇-分析函数详解

Oracle 分析函数详解

在Oracle数据库中,分析函数(Analytical Functions)是一类非常强大的工具,它们允许在查询结果集上进行复杂的计算和分析,而无需使用自连接或子查询等复杂操作。本文将详细介绍Oracle分析函数的使用方法和应用场景,包括排名函数、统计函数、取首尾记录、取上下行记录以及滑动窗口等功能。

一、排名函数

1. RANK()

RANK()函数用于计算排序后的排名,相同值排名相同,排名之间可能有间隔。

SELECT E.ENAME, E.JOB, E.SAL, E.DEPTNO,RANK() OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL DESC) AS RANK
FROM EMP E;

说明PARTITION BY E.DEPTNO将数据按部门分组,ORDER BY E.SAL DESC在每个部门内按工资降序排列,RANK()为每行分配排名。

2. DENSE_RANK()

DENSE_RANK()函数用于计算排序后的排名,相同值排名相同,但排名之间没有间隔。

SELECT E.ENAME, E.JOB, E.SAL, E.DEPTNO,DENSE_RANK() OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL DESC) AS RANK
FROM EMP E;

3. ROW_NUMBER()

ROW_NUMBER()函数为查询结果中的每一行分配一个唯一的序号。

SELECT E.ENAME, E.JOB, E.SAL, E.DEPTNO,ROW_NUMBER() OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL DESC) AS ROW_NUM
FROM EMP E;

4. NTILE(n)

NTILE(n)函数将结果集分成指定数量的组,并为每一行分配组编号。

SELECT E.ENAME, E.JOB, E.SAL, E.DEPTNO,NTILE(4) OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL DESC) AS QUARTILE
FROM EMP E;

二、统计函数

OVER关键字可以与聚合函数(如SUM()AVG()COUNT()等)结合使用,对分组数据进行统计。

SELECT E.DEPTNO, E.ENAME, E.SAL,SUM(E.SAL) OVER(PARTITION BY E.DEPTNO) AS SUM_SAL,AVG(E.SAL) OVER(PARTITION BY E.DEPTNO) AS AVG_SAL,COUNT(*) OVER(PARTITION BY E.DEPTNO) AS COUNT_EMP
FROM EMP E;

说明PARTITION BY E.DEPTNO将数据按部门分组,然后在每个分组内分别计算工资总和、平均工资和员工数量。

三、取首尾记录

OVER关键字可以与FIRST_VALUE()LAST_VALUE()函数结合使用,获取分组中的首尾记录。

SELECT E.DEPTNO, E.ENAME, E.SAL,FIRST_VALUE(E.ENAME) OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL DESC) AS MAX_SAL_EMP,LAST_VALUE(E.ENAME) OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL DESC) AS MIN_SAL_EMP
FROM EMP E;

说明PARTITION BY E.DEPTNO将数据按部门分组,ORDER BY E.SAL DESC在每个部门内按工资降序排列,FIRST_VALUE()获取每个部门工资最高的员工姓名,LAST_VALUE()获取工资最低的员工姓名。

四、取上下行记录

OVER关键字可以与LEAD()LAG()函数结合使用,获取当前行的上下行记录。

SELECT E.ENAME, E.SAL,LAG(E.SAL, 1, 0) OVER(ORDER BY E.SAL) AS PREV_SAL,LEAD(E.SAL, 1, 0) OVER(ORDER BY E.SAL) AS NEXT_SAL,E.SAL - LAG(E.SAL, 1, 0) OVER(ORDER BY E.SAL) AS DIFF_PREV,LEAD(E.SAL, 1, 0) OVER(ORDER BY E.SAL) - E.SAL AS DIFF_NEXT
FROM EMP E;

说明ORDER BY E.SAL按工资升序排列,LAG(E.SAL, 1, 0)获取当前行的前一行工资,LEAD(E.SAL, 1, 0)获取当前行的后一行工资,然后计算当前行工资与前后行工资的差额。

五、滑动窗口

通过ROWS BETWEENRANGE BETWEEN子句,OVER关键字可以指定窗口范围,实现滑动窗口计算。

SELECT E.DEPTNO, E.ENAME, E.SAL,SUM(E.SAL) OVER(PARTITION BY E.DEPTNOORDER BY E.SALROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS CUM_SUM_SAL
FROM EMP E;

说明PARTITION BY E.DEPTNO将数据按部门分组,ORDER BY E.SAL在每个部门内按工资升序排列,ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW定义窗口范围为从分组的第一行到当前行,SUM(E.SAL)计算从分组的第一行到当前行的工资累计和。

http://www.xdnf.cn/news/1163.html

相关文章:

  • ORA 600 [qkaQknLTPruneKaf:1] BUG 分析与处理
  • RSGISLib:一款功能强大的GIS与RS数据处理Python工具包
  • 【深度学习新浪潮】新视角生成的研究进展调研报告(2025年4月)
  • 具身智能的理论基础
  • 2025年五大ETL数据集成工具推荐
  • MongoDB索引
  • 智能座舱测试内容与步骤
  • 影刀RPA怎么和AI结合,制作自动采集小红书爆款文章+自动用AI改写标题、内容+用AI文生图生成发文图片+自动在小红书上发布文章
  • PyTorch 多 GPU 入门:深入解析 nn.DataParallel 的工作原理与局限
  • 基于贝叶斯优化的Transformer多输入单输出回归预测模型Bayes-Transformer【MATLAB】
  • 三网通电玩城平台系统结构与源码工程详解(五):客户端热更机制与多端资源分发流程
  • AI 技术发展:从起源到未来的深度剖析
  • 电容加速电路!
  • 二、Python编程基础02
  • 【机器学习-线性回归-2】理解线性回归中的连续值与离散值
  • Spring XML 配置
  • Kotlin集合全解析:List和Map高频操作手册
  • LM35 温度传感器介绍
  • 学习前端(前端技术更新较快,需持续关注技术更新)
  • 深入探讨:如何完美完成标签分类任务(数据治理中分类分级的分类思考)
  • 短信验证码安全实战:三网API+多语言适配开发指南
  • 网络原理 - 4(TCP - 1)
  • 短视频+直播商城系统源码全解析:音视频流、商品组件逻辑剖析
  • 【Linux】46.网络基础(3.3)
  • 何东山团队提到的“真正真空”(zero-point-free vacuum)
  • 3.1goweb框架gin下
  • 中文通用embedding:BGE
  • 使用Spark-TTS-0.5B模型,文本合成语音
  • HCIP(综合实验2)
  • mockMvc构建web单元测试学习笔记