详解Oracle查询中OVER (PARTITION BY ..)用法

本文主要介绍了oracle查询中over (partition by ..)用法,内容和代码大家参考一下,希望能帮助到大家。为了方便大家学习和测试,所有的例子都是在oracle自带用户scott下建立的。

注:标题中的红色order by是说明在使用该方法的时候必须要带上order by。

一、rank()/dense_rank() over(partition by …order by …)

现在客户有这样一个需求,查询每个部门工资最高的雇员的信息,相信有一定oracle应用知识的同学都能写出下面的SQL语句:

select e.ename, e.job, e.sal, e.deptno  from scott.emp e,     (select e.deptno, max(e.sal) sal from scott.emp e group by e.deptno) me  where e.deptno = me.deptno   and e.sal = me.sal;

在满足客户需求的同时,大家应该习惯性的思考一下是否还有别的方法。这个是肯定的,就是使用本小节标题中rank() over(partition by…)或dense_rank() over(partition by…)语法,SQL分别如下:

select e.ename, e.job, e.sal, e.deptno  from (select e.ename,         e.job,         e.sal,         e.deptno,         rank() over(partition by e.deptno order by e.sal desc) rank      from scott.emp e) e  where e.rank = 1;

select e.ename, e.job, e.sal, e.deptno  from (select e.ename,         e.job,         e.sal,         e.deptno,         dense_rank() over(partition by e.deptno order by e.sal desc) rank      from scott.emp e) e  where e.rank = 1;

为什么会得出跟上面的语句一样的结果呢?这里补充讲解一下rank()/dense_rank() over(partition by e.deptno order by e.sal desc)语法。

over: 在什么条件之上。

partition by e.deptno: 按部门编号划分(分区)。

order by e.sal desc: 按工资从高到低排序(使用rank()/dense_rank() 时,必须要带order by否则非法)

rank()/dense_rank(): 分级

整个语句的意思就是:在按部门划分的基础上,按工资从高到低对雇员进行分级,“级别”由从小到大的数字表示(最小值一定为1)。

那么rank()和dense_rank()有什么区别呢?

rank(): 跳跃排序,如果有两个第一级时,接下来就是第三级。

dense_rank(): 连续排序,如果有两个第一级时,接下来仍然是第二级。

小作业:查询部门最低工资的雇员信息。

二、min()/max() over(partition by …)

现在我们已经查询得到了部门最高/最低工资,客户需求又来了,查询雇员信息的同时算出雇员工资与部门最高/最低工资的差额。这个还是比较简单,在第一节的groupby语句的基础上进行修改如下:

蓝心千询 蓝心千询

蓝心千询是vivo推出的一个多功能AI智能助手

蓝心千询 34 查看详情 蓝心千询

select e.ename,      e.job,      e.sal,      e.deptno,      e.sal - me.min_sal diff_min_sal,      me.max_sal - e.sal diff_max_sal   from scott.emp e,      (select e.deptno, min(e.sal) min_sal, max(e.sal) max_sal       from scott.emp e       group by e.deptno) me   where e.deptno = me.deptno   order by e.deptno, e.sal;

上面我们用到了min()和max(),前者求最小值,后者求最大值。如果这两个方法配合over(partition by …)使用会是什么效果呢?大家看看下面的SQL语句:

select e.ename,     e.job,     e.sal,     e.deptno,     nvl(e.sal - min(e.sal) over(partition by e.deptno), 0) diff_min_sal,     nvl(max(e.sal) over(partition by e.deptno) - e.sal, 0) diff_max_sal  from scott.emp e;

这两个语句的查询结果是一样的,大家可以看到min()和max()实际上求的还是最小值和最大值,只不过是在partition by分区基础上的。

小作业:如果在本例中加上order by,会得到什么结果呢?

三、lead()/lag() over(partition by … order by …)

中国人爱攀比,好面子,闻名世界。客户更是好这一口,在和最高/最低工资比较完之后还觉得不过瘾,这次就提出了一个比较变态的需求,计算个人工资与比自己高一位/低一位工资的差额。这个需求确实让我很是为难,在groupby语句中不知道应该怎么去实现。不过。。。。现在我们有了over(partition by …),一切看起来是那么的简单。如下:

select e.ename,     e.job,     e.sal,     e.deptno,     lead(e.sal, 1, 0) over(partition by e.deptno order by e.sal) lead_sal,     lag(e.sal, 1, 0) over(partition by e.deptno order by e.sal) lag_sal,     nvl(lead(e.sal) over(partition by e.deptno order by e.sal) - e.sal,       0) diff_lead_sal,     nvl(e.sal - lag(e.sal) over(partition by e.deptno order by e.sal), 0) diff_lag_sal  from scott.emp e;

看了上面的语句后,大家是否也会觉得虚惊一场呢(惊出一身冷汗后突然鸡冻起来,这样容易感冒)?我们还是来讲解一下上面用到的两个新方法吧。

lead(列名,n,m): 当前记录后面第n行记录的的值,没有则默认值为m;如果不带参数n,m,则查找当前记录后面第一行的记录的值,没有则默认值为null。

lag(列名,n,m): 当前记录前面第n行记录的的值,没有则默认值为m;如果不带参数n,m,则查找当前记录前面第一行的记录的值,没有则默认值为null。

下面再列举一些常用的方法在该语法中的应用(注:带order by子句的方法说明在使用该方法的时候必须要带order by):

select e.ename,     e.job,     e.sal,     e.deptno,     first_value(e.sal) over(partition by e.deptno) first_sal,     last_value(e.sal) over(partition by e.deptno) last_sal,     sum(e.sal) over(partition by e.deptno) sum_sal,     avg(e.sal) over(partition by e.deptno) avg_sal,     count(e.sal) over(partition by e.deptno) count_num,     row_number() over(partition by e.deptno order by e.sal) row_num  from scott.emp e;

大家在读完本片文章之后可能会有点误解,就是OVER (PARTITION BY ..)比GROUP BY更好,实际并非如此,前者不可能替代后者,而且在执行效率上前者也没有后者高,只是前者提供了更多的功能而已,所以希望大家在使用中要根据需求情况进行选择。

相关推荐:

Oracle程序开发小技巧

Oracle使用触发器和mysql中使用触发器的案例比较

oracle数据库常用的99条查询语句

以上就是详解Oracle查询中OVER (PARTITION BY ..)用法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/387407.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月6日 14:16:24
下一篇 2025年11月6日 14:17:12

相关推荐

  • 如何调试HTML布局问题_元素检查与修复方案【教程】

    HTML布局问题主要由CSS样式冲突、盒模型计算错误或HTML嵌套不当引起,需通过开发者工具定位元素、检查display与定位属性、验证margin折叠与高度塌陷、审查flex/grid对齐行为、排除CSS重置干扰五步系统排查修复。 如果您在编写HTML页面时发现布局出现错位、重叠、空白异常或元素未…

    2025年12月23日
    000
  • 优化搜索栏布局:解决输入框与按钮对齐问题的专业指南

    针对搜索栏中输入框与提交按钮因css样式冲突导致的对齐问题,本文提供了一套专业的解决方案。通过合理使用flexbox布局、精细化元素选择器及样式隔离,确保输入框与按钮完美对齐,并实现整体搜索栏的精准定位与美观呈现,从而提升用户界面的视觉一致性与可用性。 问题分析:CSS样式冲突与布局挑战 在网页开发…

    2025年12月23日
    000
  • java怎么编译运行.html_java编译运行.html方法【教程】

    Java程序的编译运行与HTML无关,需使用JDK。1. 编写HelloWorld.java文件;2. 命令行执行javac HelloWorld.java生成.class文件;3. 执行java HelloWorld运行程序。注意:HTML是网页标记语言,不能直接运行Java代码,勿将二者混淆。确…

    2025年12月23日
    000
  • html文档中含有java怎么运行_html含java运行方法【教程】

    现代浏览器不支持Java Applet,推荐通过JavaScript调用Java后端服务或使用WebAssembly运行Java代码。 如果您在HTML文档中嵌入了Java代码,但发现无法正常运行,这通常是因为现代浏览器不再支持Java小程序(Applet)或相关插件。以下是几种实现HTML中Jav…

    2025年12月23日
    000
  • 怎么运行html的applet小程序_运行html applet小程序步骤【指南】

    现代浏览器已不再默认支持Java Applet,需通过安装JRE、启用插件、使用支持NPAPI的旧版浏览器(如Firefox 52.9 ESR)、调整Java安全级别至中,并将网站添加到例外站点列表方可运行。 如果您在尝试运行HTML中的Applet小程序时遇到问题,可能是因为现代浏览器已不再默认支…

    2025年12月23日
    000
  • 解决CSS布局中的浮动问题:使用Flexbox优化元素定位

    本文旨在解决因CSS `float`属性不当使用导致的元素定位问题,特别是当后续元素未能按预期排列时。我们将深入分析`float`的工作原理及其对文档流的影响,并提供一个基于Flexbox的现代解决方案,以实现更精确和可控的布局。通过移除不必要的`float`并合理运用Flexbox,可以确保元素按…

    2025年12月23日
    000
  • 如何通过HTML5 Progress元素显示进度条的详细步骤

    HTML5的progress元素可语义化显示进度,通过value和max属性定义进度状态,结合JavaScript动态更新数值,使用CSS伪元素自定义样式,并添加aria-label和辅助文本提升可访问性。 HTML5 的 progress 元素提供了一种简单且语义化的方式来显示任务的完成进度。它不…

    2025年12月23日
    000
  • 纯CSS替换标签文本内容的实用技巧

    本文探讨了如何利用纯css技术替换html ` `标签的默认文本内容。通过介绍两种主要方法:利用 `text-indent` 结合 `float` 隐藏原文并插入新文本,以及将 `font-size` 设置为零并使用伪元素覆盖。文章提供了详细的代码示例和实现原理,并强调了在可访问性(屏幕阅读器和搜索…

    2025年12月23日
    000
  • html滚动条拖拽手感怎么优化_html滚动条拖动流畅度优化教程

    通过CSS和JavaScript优化滚动性能,首先启用硬件加速,使用transform: translateZ(0)和will-change: scroll-position提升流畅度;其次减少重绘回流,避免高开销样式,固定子元素尺寸并隔离渲染;接着用pointer事件模拟拖拽,结合requestA…

    2025年12月23日
    000
  • 使用BeautifulSoup和JSON有效抓取动态加载的网页表格数据

    本教程旨在解决使用BeautifulSoup抓取网页表格时,因数据动态加载导致部分内容缺失的问题。通过分析网页背后的API请求,直接获取并解析JSON数据源,再结合BeautifulSoup提取的HTML结构信息,最终实现完整且准确的数据抓取。文章将提供详细的代码示例和实现步骤。 理解网页动态内容与…

    2025年12月23日
    400
  • 解决BeautifulSoup爬取网页表格中动态内容缺失问题

    本文旨在解决使用BeautifulSoup爬取网页表格时,因部分数据通过JavaScript动态加载导致内容缺失的问题。通过详细分析Oracle云定价页面的案例,教程将指导读者如何识别并获取隐藏在JSON API中的动态数据,并将其与BeautifulSoup解析的静态HTML内容有效整合,最终构建…

    2025年12月23日
    000
  • 使用 jquery.terminal 在指定 div 元素中创建交互式终端教程

    本教程详细介绍了如何在网页中,不占用整个 `body` 标签,而是在一个特定的 `div` 元素内集成并初始化 `jquery.terminal`。文章将涵盖必要的 html 结构、css 样式、外部依赖引入以及 javascript 初始化代码,并提供一个简单的自定义命令示例,帮助开发者快速构建功…

    2025年12月23日
    000
  • 使用Flexbox实现图片尺寸调整与横向布局

    本教程详细阐述如何利用css flexbox高效管理网页中的图片尺寸与布局。通过将图片容器设置为弹性盒模型(`display: flex`)并对图片应用相对宽度(`width: 100%`),可以确保多张图片在同一行内整齐排列,并实现响应式尺寸调整,为后续的交互效果(如悬停过渡)打下坚实基础。 在网…

    2025年12月23日 好文分享
    000
  • 响应式图片处理:利用CSS实现图片自适应与宽高比保持

    本教程详细讲解如何使用css属性`max-width: 100%`、`max-height: 100%`和`display: block`,实现网页图片在不同屏幕尺寸下自动调整大小,确保图片始终适应其容器且不产生滚动条,同时完美保持原始宽高比,提升用户体验和页面布局的稳定性。 在现代网页设计中,确保…

    2025年12月23日
    000
  • html在线网页折叠面板 html在线UI组件开发实例

    折叠面板通过点击标题展开或收起内容,示例包含HTML、CSS和JavaScript实现,支持多面板独立操作,适用于FAQ等场景,代码可直接运行并扩展。 网页折叠面板(Accordion)是一种常见的UI组件,适用于展示分组内容,节省页面空间。下面是一个简单的HTML在线折叠面板实现示例,包含基础的H…

    2025年12月23日
    000
  • 解决CSS伪元素 :after 悬停或点击无响应的问题:星级评分示例

    本文旨在解决使用 CSS 伪元素 `:after` 实现星级评分功能时,悬停或点击事件无法正确触发的问题。通过分析问题的根源,提供修改后的 CSS 代码,确保 `:after` 伪元素能够响应用户的交互行为,从而实现预期的星级评分效果。主要涉及 CSS 定位、透明度控制以及伪元素选择器的正确使用。 …

    2025年12月23日
    000
  • 如何在HTML5中实现无控制条的视频循环播放(模拟GIF效果)

    本文详细讲解如何在HTML5中创建无控制条的循环视频,使其表现如同GIF动图。通过省略标签的controls属性,并配合loop、autoplay和muted等属性,您可以轻松实现视频的自动播放和无缝循环,为用户提供流畅的视觉体验,避免了传统视频控件的干扰。 理解HTML5视频控制条 html5的标…

    2025年12月22日
    000
  • WordPress Elementor 中产品卡片按钮联动外部内容显示教程

    本教程旨在指导用户如何在 WordPress Elementor 中,通过自定义产品卡片上的按钮触发动态内容的显示,例如嵌入式的 Calendly 预约组件。文章将详细介绍如何利用 HTML、CSS 和 JavaScript 结合,实现按钮点击后切换隐藏/显示外部内容的交互逻辑,并提供完整的代码示例…

    2025年12月22日
    000
  • 构建响应式多列布局:浮动与媒体查询的实践指南

    本文详细阐述了如何使用CSS的float属性结合媒体查询,创建出能根据屏幕宽度自适应调整列数的响应式布局。从移动设备的单列布局,到平板电脑的两列,再到桌面端的三列,我们将通过实际代码示例,实现一个结构清晰、用户体验友好的多列页面,并提供关键的实现细节和注意事项。 响应式多列布局概述 在现代网页设计中…

    2025年12月22日
    000
  • CSS浮动布局中页脚定位与清除浮动技巧

    本教程详细探讨了在CSS两列浮动布局中,页脚元素出现错位或背景溢出等布局异常的原因,并提供了两种核心的解决方案:使用clear属性创建清除浮动元素,以及利用overflow: hidden属性在父容器上实现BFC(块级格式化上下文)来自动清除浮动。文章通过代码示例和专业解析,帮助开发者有效管理浮动元…

    2025年12月22日 好文分享
    000

发表回复

登录后才能评论
关注微信