技术标签: oracle
可用范围
The aggregate_function argument is any one of the MIN, MAX, SUM, AVG, COUNT, VARIANCE, or STDDEV functions.
It operates on values from the rows that rank either FIRST or LAST.
If only one row ranks as FIRST or LAST, then the aggregate operates on a singleton (nonaggregate) set.
规定了可用范围。只有min, max, sum, avg, count, variance, stddev 这些聚合函数可以接keep使用。也就是说像 first_value,last_value,lead,lag,percent_rank这样的函数是不可用的。应用范围其实比较窄。
以任意规则排序,并取first rank行所对应的指定列情况下使用。
在正确使用的情况下通常会有更好的效率。
与min, max, sum, avg, count, variance, stddev这些函数组合使用
由于first与last函数只有一个顺序的差别,本文将只讲解first情况下的。
文档中对语法的解释:
FIRST and LAST are very similar functions. Both are aggregate and analytic functions that operate on a set of values from
a set of rows that rank as the FIRST or LAST with respect to a given sorting specification.
If only one row ranks as FIRST or LAST, then the aggregate operates on the set with only one element.
解释:它会返回排序之后为first的部分。first的部分可以是一行,也可以是多行(这也是与first_value函数最大的区别)。
If you omit the OVER clause, then the FIRST and LAST functions are treated as aggregate functions.
You can use these functions as analytic functions by specifying the OVER clause.
The query_partition_clause is the only part of the OVER clause valid with these functions.
If you include the OVER clause but omit the query_partition_clause, then the function is
treated as an analytic function, but the window defined for analysis is the entire table.
解释:如果省略over,first将作为聚合函数。可以添加over从句使其成为分析函数。over从句中将只能使用分组从句(如果用排序将直接报错)。如果用了over并省略分组从句,函数将作用于全表(over从句的一般特点)。
查询emp表中福利最大员工的最高工资
select max(sal) keep(dense_rank last order by comm desc nulls last) maxsalcomm from emp;--结果为:5000
查询emp表中各个组comm福利最大的员工工资最大值
由于是分组统计,因此使用over开窗函数子句
select emp.*,max(sal) keep(dense_rank last order by comm desc nulls last) over(partition by deptno) maxsalcomm from emp;
结果如下:
分析函数
获取comm最大的行中sal最大值 (null排最后)
获取每组中comm最大的行中sal最大值 (null排最后)
对comm最大行的sal求和,这里为了验证,我们让null排最前
select emp.*,max(sal) keep(dense_rank last order by comm desc nulls last) over() maxsalcomm,
max(sal) keep(dense_rank last order by comm desc nulls last) over(partition by deptno) deptmaxsal,
sum(sal) keep(dense_rank first order by comm desc nulls first) over(partition by deptno) deptcommsum from emp
结果如下:
应用场景
When you need a value from the first or last row of a sorted group, but the needed value is not the sort key,
the FIRST and LAST functions eliminate the need for self-joins or views and enable better performance.
解释:从排好序的组中获取first rank的行,并且所取的列不是排序用的列。在这种情况下,使用first函数可以替代自连接或是视图的方法,并且可以获得更好的性能。
使用示例
简单点说就是以B列做排序,并取B列最大的行所对应的A列。正如上一个例子所写的那样。
再扩展一下。以任意规则排序,并取first行所对应的指定列。比如这样
select t.dept,
t.salary,
t.bonus,
max(t.salary) keep(dense_rank first order by t.bonus + t.salary, mod(t.bonus, 2), t.bonus / t.salary nulls last) over() max
from nayi_first_180410 t;
这个排序并没有实际意义,我想说的是,它可以作用于任何合法的order语句,而不是限定于某个列。
效率解释
至于文档中所说的提升效率,我们可以通过改写sql的方法来观察一下。
--作为聚合函数求最大bonus对应的salary
select max(t.salary) keep(dense_rank first order by t.bonus desc) max
from nayi_first_180410 t;
--通过视图方法求最大bonus对应的salary
select max(t.salary)
from (select t.salary,
t.bonus,
dense_rank() over(order by t.bonus desc) dense_rank
from nayi_first_180410 t) t
where t.dense_rank = 1;
--通过自连接方法求最大bonus对应的salary
select max(t1.salary)
from nayi_first_180410 t1
where t1.bonus = (select max(v1.bonus) from nayi_first_180410 v1)
;
------------------------------------------------------------------
--作为分析函数求每个dept最大bonus行所对应的salary
select t.*, max(t.salary) keep(dense_rank first order by t.bonus desc) over(partition by t.dept) max
from nayi_first_180410 t;
--通过视图方法求每个dept最大bonus行所对应的salary
select t1.name,
t1.dept,
t1.salary,
t1.bonus,
max(decode(t1.dense_rank, 1, t1.salary, null)) over(partition by t1.dept) max
from (select t1.*,
dense_rank() over(partition by t1.dept order by t1.bonus desc) dense_rank
from nayi_first_180410 t1) t1;
--通过自连接方法求每个dept最大bonus行所对应的salary
select t1.name, t1.dept, t1.salary, t1.bonus, t2.salary max
from nayi_first_180410 t1,
(select t2.dept,
t2.bonus,
max(t2.salary) salary,
dense_rank() over(partition by t2.dept order by t2.bonus desc) dense_rank
from nayi_first_180410 t2
group by t2.dept, t2.bonus) t2
where t1.dept = t2.dept
and t2.dense_rank = 1
order by t1.name
;
前三个sql结果集
MAX
4200
后三个sql结果集
NAME DEPT SALARY BONUS MAX
a 1 2500 100 2500
b 2 3000 500 5000
c 2 3000 50 5000
d 2 5000 600 5000
e 3 4000 800 4200
f 3 4200 800 4200
这是两组完全等效的sql。
虽然有很多种其他的改写方法,但是执行计划都是大同小异。
很明显,使用first函数将只需要一次table access full与一次window sort。使用视图将在此基础上多一层view。使用自连接的方法将至少多一次table access full。因此使用first函数将更有效率优势。在代码量与可读性上也有一些优势。
文章浏览阅读202次。文章目录一、springboot中spring data jpa的配置pom.xml配置application.yml测试类基础模板二、spring data jpa利用原生sql或者jpql执行数据库操作实体bean三、spring data jpa根据命名规则查询四、specification(规范查询,分页,动态sql)五、多表关联查询一、springboot中spring data jp..._data jpa在springboot中
文章浏览阅读3k次。文章目录前言安装步骤1.准备工作2.下载ansible安装包3.安装3.1 修改压缩包3.2 解压缩3.3 安装总结前言此Win10安装ansible方案,只是为了解决win环境下开发python项目时,涉及ansible模块引用报错的问题。如果想在win环境下安装ansible进行客户端管理或playbook开发,本文所述方案不适合!可了解一下Cygwin或Windows Subsystem for Linux。安装步骤在win环境下直接使用pip install ansible安装肯定是会_windows下载ansible安装包
文章浏览阅读1.1k次。今天帮公司搞一个mac的开发项目,就是最简单的用webview套一个网页就可以了。代码就一句话可惜,报了这堆错误,而且webview一片空白。后来在网上终于找到了解决方法,在这里分享给大家。
文章浏览阅读2.4k次。【编者Peter Ye按】再开始正文之前,先分享我最近思考得出的一段话: 互联网解决了信息随时分享,移动互联网解决了信息随地分享,物联网解决了信息随物分享,而构建在三者基..._软件定义存储的空间
文章浏览阅读1.1w次,点赞5次,收藏10次。昨天由于项目需求,需要使用redis分布式锁,在网上找了半天,也没有找到一个简单的教程,经过自己研究,了解简单使用方法,都可以直接拿过来自己用,下面我就发出来给大家分享一下。首先下载 github.com/garyburd/redigo,因为这个分布式锁是根据上面所实现; 下载 gopkg.in/redsync.v1这个就是实现分布式锁的源代码(如果测试需要下载 github.c..._can be used to set the clock drift factor.
文章浏览阅读555次。作者 | 数据分析1480来源 | lsxxx2011(1) 无监督和有监督算法的区别?有监督学习:对具有概念标记(分类)的训练样本进行学习,以尽可能对训练样本集外的数据进行标记(分类)预测。这里,所有的标记(分类)是已知的。因此,训练样本的岐义性低。无监督学习:对没有概念标记(分类)的训练样本进行学习,以发现训练样本集中的结构性知识。这里,所有的标记(分..._cda level Ⅲ 面试题
文章浏览阅读148次。本文转载于:猿2048网站https://www.mk2048.com/blog/blog.php?id=i2bckjb&title=Windows%E7%8E%AF%E5%A2%83%E4%B8%8Bsublime+text+3%E6%90%AD%E5%BB%BA%E5%89%8D%..._windows下sublime搭建前端环境
文章浏览阅读88次。班级学生排队,男生按照身高从低到高排一队,女生,按照姓名从小到大排一队(使用接口和匿名内部类)package homework;import java.sql.Connection;import java.util.Arrays;/*班级学生排队,男生按照身高从低到高排一队,女生,按照姓名从小到大排一队(使用接口和匿名内部类)分析:接口,数组,枚举,匿名内部类,Arrrys工具类,String的方法实现过程:1.分组按照性别分成男队和女队2.排序使用接口制定对应的规则分别实._java 接口 匿名类 案例
文章浏览阅读251次。公有继承基类和派生类之间构造和析构、赋值和拷贝构造函数的关系(上)1、公有继承基类和派生类之间构造函数的关系如果一个类Text在公有继承了Object类,在创建一个Text对象t时会先调用Object的构造函数,然后再调用Text的构造函数,不论Text的形参列表声明中Object的声明在前在后。代码测试:#include<iostream>using namespace std;class Object{ private: int val; public: Object_公有继承 构造
文章浏览阅读504次。前言随着App的用户界面的内容越来越丰富,再强的手机可能都无法同时渲染复杂的UI界面和保证流畅的体验。所以,我们这些程序猿=。=在写代码的时候就要注意,如何尽可能提高用户的操作流畅性。之前的做的项目,青桔音乐iOS客户端里面的首页就是一个类似微信朋友圈的“动态”页面,大致如下:青桔动态页面如果是你,你会怎么实现这个页面呢?这还用问,当然是用UITableView+自定义_android uitableview优化
文章浏览阅读348次。文章目录项目Maven聚合rpc 模块创建继承pom 依赖配置relativePath元素可以通过继承的元素有以下这些依赖管理(dependencyManagement)项目github 建个仓库执行 git clone 克隆项目到本地idea 新建项目Maven聚合<modules> <module>模块1</module> ..._pom resources子模块继承
文章浏览阅读4.2k次。问题全部为:cv2.error: OpenCV(4.2.0) /io/opencv/modules/imgproc/src/imgwarp.cpp:3391: error: (-215:Assertion failed) src.checkVector(2, CV_32F) == 4 && dst.checkVector(2, CV_32F) == 4 in function 'getPerspectiveTransform'出现在使用cv2.getPerspectiveTransfo_cv2.error: opencv(4.2.0) /io/opencv/modules/imgproc/src/imgwarp.cpp:3391: er