oracle keep 分析函数_oracle sum()keep-程序员宅基地

技术标签: 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这些函数组合使用

 

1、FIRST and LAST are very similar functions.

由于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从句的一般特点)。


例子
1、聚合函数

查询emp表中福利最大员工的最高工资

select max(sal) keep(dense_rank last order by comm desc nulls last) maxsalcomm from emp;--结果为:5000

 

2,分析函数

  查询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.

如下是摘抄别人的:https://blog.csdn.net/nayi_224/article/details/79869802

解释:从排好序的组中获取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函数将更有效率优势。在代码量与可读性上也有一些优势

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zk052300/article/details/103278561

智能推荐

Spring Data JPA在springboot中的应用-程序员宅基地

文章浏览阅读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中

Win10安装Ansible Python包_windows下载ansible安装包-程序员宅基地

文章浏览阅读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安装包

macOS开发,发现webview连接不上网络。。已解决-程序员宅基地

文章浏览阅读1.1k次。今天帮公司搞一个mac的开发项目,就是最简单的用webview套一个网页就可以了。代码就一句话可惜,报了这堆错误,而且webview一片空白。后来在网上终于找到了解决方法,在这里分享给大家。

当软件定义存储(SDS)遇见区块链(BlockChain)-程序员宅基地

文章浏览阅读2.4k次。【编者Peter Ye按】再开始正文之前,先分享我最近思考得出的一段话: 互联网解决了信息随时分享,移动互联网解决了信息随地分享,物联网解决了信息随物分享,而构建在三者基..._软件定义存储的空间

golang使用redis分布式锁_can be used to set the clock drift factor.-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏10次。昨天由于项目需求,需要使用redis分布式锁,在网上找了半天,也没有找到一个简单的教程,经过自己研究,了解简单使用方法,都可以直接拿过来自己用,下面我就发出来给大家分享一下。首先下载 github.com/garyburd/redigo,因为这个分布式锁是根据上面所实现; 下载 gopkg.in/redsync.v1这个就是实现分布式锁的源代码(如果测试需要下载 github.c..._can be used to set the clock drift factor.

22道机器学习常见面试题目汇总!(附详细解答)-程序员宅基地

文章浏览阅读555次。作者 | 数据分析1480来源 | lsxxx2011(1) 无监督和有监督算法的区别?有监督学习:对具有概念标记(分类)的训练样本进行学习,以尽可能对训练样本集外的数据进行标记(分类)预测。这里,所有的标记(分类)是已知的。因此,训练样本的岐义性低。无监督学习:对没有概念标记(分类)的训练样本进行学习,以发现训练样本集中的结构性知识。这里,所有的标记(分..._cda level Ⅲ 面试题

随便推点

Windows环境下sublime text 3搭建前端开发环境-程序员宅基地

文章浏览阅读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搭建前端环境

小白学java日记——接口与匿名内部类的实例_java 接口 匿名类 案例-程序员宅基地

文章浏览阅读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_公有继承 构造

提升UITableView性能-复杂页面的优化_android uitableview优化-程序员宅基地

文章浏览阅读504次。前言随着App的用户界面的内容越来越丰富,再强的手机可能都无法同时渲染复杂的UI界面和保证流畅的体验。所以,我们这些程序猿=。=在写代码的时候就要注意,如何尽可能提高用户的操作流畅性。之前的做的项目,青桔音乐iOS客户端里面的首页就是一个类似微信朋友圈的“动态”页面,大致如下:青桔动态页面如果是你,你会怎么实现这个页面呢?这还用问,当然是用UITableView+自定义_android uitableview优化

maven 聚合、继承详解_pom resources子模块继承-程序员宅基地

文章浏览阅读348次。文章目录项目Maven聚合rpc 模块创建继承pom 依赖配置relativePath元素可以通过继承的元素有以下这些依赖管理(dependencyManagement)项目github 建个仓库执行 git clone 克隆项目到本地idea 新建项目Maven聚合<modules> <module>模块1</module> ..._pom resources子模块继承

cv2.error: OpenCV(4.2.0) /io/opencv/modules/imgproc/src/imgwarp.cpp:3391-程序员宅基地

文章浏览阅读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

推荐文章

热门文章

相关标签