Oracle窗口函数

news/2025/12/11 8:54:53/文章来源:https://www.cnblogs.com/dirgo/p/19334156

Oracle窗口函数是SQL中极其强大的工具,它允许你在不折叠分组行的前提下,对一组相关的行(一个“窗口”)进行计算。理解它能将你的数据分析能力提升一个维度。

一、核心概念:它是什么?

想象一下普通的GROUP BY:它将多行合并成一行。窗口函数恰恰相反:它为查询结果的每一行都返回一个值,这个值是基于与该行相关的一组行计算而来的。

关键区别

  • GROUP BY + 聚合函数:多行输入,一行输出(每个分组)。
  • 窗口函数 + 聚合/分析函数:多行输入,多行输出(每行都附加计算结果)。

二、核心语法结构

function_name([arguments]) 
OVER ([PARTITION BY partition_expression, ...]  -- 定义窗口分区(分组)[ORDER BY sort_expression [ASC | DESC], ...] -- 定义窗口内排序[ROWS/RANGE window_frame_clause] -- 定义窗口框架(计算范围)
)

三、三大核心组成部分详解

1. PARTITION BY

将整个结果集划分为更小的、独立的“窗口”或分区。计算在每个分区内独立进行。

  • 示例PARTITION BY department_id 会按部门创建独立窗口。

2. ORDER BY

定义窗口内行的顺序。这对于排名、累计计算等至关重要。

  • 示例ORDER BY sale_date DESC 会让窗口按销售日期降序排列。

3. 窗口框架 (ROWS/RANGE)

当使用ORDER BY时,可以进一步限定计算的具体范围。这是窗口函数最精细的控制部分。

  • ROWS:基于物理行的偏移。
    • ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING:当前行、前一行、后一行。
    • ROWS UNBOUNDED PRECEDING:从分区第一行到当前行(常用于累计)。
  • RANGE:基于ORDER BY列的值的逻辑偏移。
    • RANGE BETWEEN INTERVAL '1' DAY PRECEDING AND CURRENT ROW:值在(当前日期-1天)到当前日期之间的所有行。

四、常用窗口函数分类与示例

我们用一个员工薪资表 emp_salary 来举例:

EMP_ID NAME DEPT SALARY HIRE_DATE
101 张三 销售 8000 2020-01-01
102 李四 销售 9000 2019-06-01
103 王五 技术 12000 2021-03-01
104 赵六 技术 11000 2020-08-01
105 钱七 销售 8500 2021-05-01

1. 排名函数

ROW_NUMBER():连续的、唯一的序号(即使值相同)。

SELECT emp_id, name, dept, salary,ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) as dept_salary_rank_row
FROM emp_salary;

结果:技术部,王五(12000)排1,赵六(11000)排2。销售部,李四(9000)排1,钱七(8500)排2,张三(8000)排3。

RANK()DENSE_RANK():处理并列排名。

  • RANK():并列会占用名次。如:1, 2, 2, 4, ...
  • DENSE_RANK():并列不占用名次。如:1, 2, 2, 3, ...

2. 聚合函数(用作窗口函数)

SUM(), AVG(), COUNT(), MAX(), MIN()

SELECT emp_id, name, dept, salary,SUM(salary) OVER (PARTITION BY dept) as dept_total_salary, -- 部门总薪资AVG(salary) OVER (PARTITION BY dept) as dept_avg_salary,   -- 部门平均薪资SUM(salary) OVER (PARTITION BY dept ORDER BY hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as dept_cumulative_salary -- 部门按入职累计薪资
FROM emp_salary;

3. 分布函数

PERCENT_RANK():(当前行的RANK值 - 1) / (总行数 - 1),结果在0~1之间。
CUME_DIST():小于等于当前行值的行数 / 分区总行数。

4. 前后行取值函数(极其实用)

LAG(column, n):获取窗口内当前行之前第n行的值。
LEAD(column, n):获取窗口内当前行之后第n行的值。

-- 查看每位员工与其部门内上一名员工的薪资差
SELECT emp_id, name, dept, salary,LAG(salary, 1) OVER (PARTITION BY dept ORDER BY salary) as prev_salary,salary - LAG(salary, 1) OVER (PARTITION BY dept ORDER BY salary) as salary_diff
FROM emp_salary;

5. 首尾取值函数

FIRST_VALUE(column):返回窗口第一行的值。
LAST_VALUE(column):返回窗口最后一行的值。
注意:使用LAST_VALUE时,通常需要指定完整的窗口框架,否则默认范围是RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,可能不是你想要的结果。

五、一个综合性的复杂示例

-- 查询:找出每个部门薪资排名前2的员工,并展示该员工薪资与部门最高、平均薪资的对比,以及比部门内上一位入职员工的薪资增长情况。
SELECT dept,name,salary,hire_date,dept_salary_rank,dept_max_salary,ROUND(salary / dept_avg_salary * 100, 2) || '%' as vs_avg_pct, -- 薪资 vs 部门平均salary - prev_emp_salary as salary_increase_from_prev -- 比前一位员工高多少
FROM (SELECT dept,name,salary,hire_date,ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) as dept_salary_rank,MAX(salary) OVER (PARTITION BY dept) as dept_max_salary,AVG(salary) OVER (PARTITION BY dept) as dept_avg_salary,LAG(salary, 1) OVER (PARTITION BY dept ORDER BY hire_date) as prev_emp_salaryFROM emp_salary
)
WHERE dept_salary_rank <= 2
ORDER BY dept, dept_salary_rank;

六、性能与最佳实践要点

  1. 性能:窗口函数通常在数据库内部进行优化,性能远优于使用自连接或相关子查询实现相同逻辑。但复杂的窗口框架(尤其是RANGE)可能开销较大。
  2. 索引是朋友:在PARTITION BYORDER BY涉及的列上建立索引,能大幅提升窗口函数的执行速度。
  3. 执行顺序:记住,窗口函数是在WHERE, GROUP BY, HAVING子句之后执行的。因此,你不能在WHERE子句中直接引用窗口函数别名。如果需要过滤窗口函数结果,必须使用子查询或WITH(CTE)。
  4. 适用版本:Oracle 8i开始引入基础分析函数,后续版本功能不断增强。本文所述功能在Oracle 9i及以上版本均支持,部分高级功能(如LISTAGG)在11g后更完善。

窗口函数初看复杂,但它是编写清晰、高效分析SQL的基石。建议你从ROW_NUMBER()SUM() OVER (PARTITION BY ...)开始练习,逐步尝试LAG/LEAD和窗口框架,很快就能掌握其精髓。

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

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

相关文章

Error running Application.Command line is too long

问题 :运行application的时候,命令太长,导致启动失败 解决方案: 设置:Shorten command line

2025年工业防爆除湿机厂家排行榜,看哪家口碑好、技术强? - mypinpai

为帮助石油化工、制药等易燃易爆场景企业精准锁定适配自身需求的防爆除湿机供应商,避免因设备选型不当引发安全事故或性能不足问题,我们从防爆安全认证(如Ex d IIB T4 Gb等国家防爆标准符合性)、极端工况适配能力(…

软件推荐:Beyond.Compare.v3.3.13.18981 文本对比软件

软件推荐:Beyond.Compare.v3.3.13.18981 文本对比软件 使用背景: 开发了A功能模块,然后来了一个定制需求,cv了A模块,叫A1模块,过了一段时间,需要将 A模块,A1模块合并。 这个时候,属于后续功能梳理的阶段。就用…

2025年实力强的超级电容制造企业TOP5:国内知名制造商权 - myqiye

随着新能源、轨道交通、航天航空等领域对储能器件可靠性与响应速度的要求提升,超级电容凭借瞬时大功率输出、长循环寿命的特性,成为工业制造场景的核心部件。但市场上部分产品存在漏液失效、售后响应慢、定制化能力不…

2025年杭州会议室全彩屏五大靠谱货源渠道推荐,包安装维护服 - 工业品牌热点

在数字化办公浪潮下,会议室全彩屏已成为企业高效沟通、品牌展示的核心设备,其显示效果、稳定性与服务质量直接影响会议体验与企业形象。面对杭州市场上鱼龙混杂的货源渠道,如何找到既包安装维护、又品质可靠的合作伙…

负载均衡相关的upstream模块参数

负载均衡相关的upstream模块参数$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");一、调度算法[控制分发请求到后端] 1.轮询:请求逐一分配到后端服务器(默认…

2025年杭州艺术学校TOP5推荐:杭州艺术学校靠谱的美术中 - 工业推荐榜

本榜单依托2025年杭州艺术学校美术考试录取数据、真实学员口碑与行业权威认证,深度筛选出五家标杆机构,为备考家庭提供客观选型依据,助力精准匹配适配的升学伙伴。 TOP1 推荐:杭州灰色调画室 推荐指数:★★★★★…

2025年移动工业防爆除湿机厂家排名,靠谱防爆除湿机品牌推荐 - mypinpai

为帮石油化工、制药等易燃易爆场景企业精准锁定适配的防爆除湿机供应商,避免因设备选型失误引发安全事故或增加运维成本,我们从防爆安全认证(如Ex d IIB T4 Gb等权威认证覆盖)、极端工况性能(低温/高湿环境除湿效…

架设一台NFS服务器,并按照以下要求配置 - 教程

架设一台NFS服务器,并按照以下要求配置 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

2025年度靠谱的超级电容生产商TOP5权威推荐:看哪家售后 - myqiye

能源转型与工业智能化浪潮下,超级电容因高功率密度、长循环寿命的特性,成为电网储能、航天装备、新能源汽车等领域的核心支撑部件。2024年全球超级电容市场规模突破320亿元,年增速达38%,但行业投诉中35%集中于产品…

深入解析:信息守恒下的涌现与 AI 传输质量观测

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年杭州会议室全彩屏本地服务商推荐:靠谱的本地会议室全 - 工业品牌热点

本榜单依托浙江地区LED显示市场调研与真实客户口碑,聚焦会议室场景需求,深度筛选出五家专业服务商,为企业、政府、学校等客户选型提供客观依据,助力精准匹配适配的会议室全彩屏解决方案。 TOP1 推荐:杭州华弟智能…

2025杭州艺术学校美术专业生源TOP5合作画室权威推荐:助 - 工业推荐榜

近年来,浙江省艺术教育升学竞争日趋激烈,初三美术生家长常陷入三大困惑:杭州艺术学校美术专业生源如何选拔?新校区设施是否匹配专业培养需求?院校档次能否为升学铺路?2024年数据显示,浙江美术中考报名人数突破3…

中小企业ChatBI实施完整指南:从选型到落地

解决实际痛点,提供系统化实施路径,降低数据决策门槛 引言:数据困境下的中小企业突围之路 在数字化浪潮中,数据已成为企业发展的核心驱动力。然而,对于广大中小企业而言,数据利用却往往陷入“看得见,摸不着”的困…

2025-2026年恒温恒湿试验箱十大厂家盘点,涵盖高低温试验箱/冷热冲击试验箱供应商,带您快速了解行业内的优质品牌与核心优势 - 品牌推荐大师1

在工业产品可靠性测试领域,恒温恒湿试验箱是模拟各类复杂温湿度环境、验证产品耐受能力的核心设备,其性能直接关乎检测数据的精准性与产品质量的把控。随着航空航天、新能源、电子电器等行业对环境测试需求的持续升级…

Python 机器学习入门实战:客户流失预测任务全教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

windriver 第8章:调试驱动程序

以下是完整的第8章调试驱动程序的 Markdown 文档,可直接复制保存为 .md 文件使用: 第8章:调试驱动程序 以下章节将介绍如何调试硬件访问应用程序代码。 8.1 用户模式调试 由于 WinDriver 从用户模式访问,我们建议你…

2025年质量好的酒店油烟管道清洗厂家质量评选榜(可靠) - 行业平台推荐

2025年质量好的酒店油烟管道清洗厂家质量评选榜(可靠)行业背景与市场趋势随着我国餐饮业和酒店业的蓬勃发展,油烟管道清洗行业迎来了快速增长期。据统计,2024年全国餐饮业总收入已突破5.2万亿元,酒店业规模达到68…

visual studio提示使用100缩放放比例重新启动

1打开注册表编辑器(WIN+R组合键,输入regedit)找到【计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers】 新建字符串值, 字符串的名称设置为visual studio的启动路径(…

2025年口碑好的双温防爆冰箱生产商推荐:看哪家产品质量好 - mypinpai

本榜单依托防爆制冷设备行业全维度市场调研与真实客户口碑反馈,深度筛选出五家标杆企业,覆盖双温防爆冰箱、实验室防爆冰箱、医用冷冻冷藏防爆冰箱等核心品类,为化工、制药、实验室等场景用户选型提供客观依据,助力…