最近遇到一个需求,将查询出的数据按照地区分组,随机取出每个区域的2条数据,这里用到了oracle的分析和开窗函数:

最终写出的sql如下:

select * from (select region,row_number() over(partition by region order by DBMS_RANDOM.random) rn
from T_PROCURE_REVIEW_EXPERT) where rn < 3

什么是分析函数(partition by):

分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值。

普通的聚合函数用group by分组,每个分组返回一个统计值,只有一行,而分析函数采用partition by分组,每组中包含多个值。

partition by deptno 是可选的分区子句,如果不存在任何分区子句,则全部的结果集可看作一个单一的大区。

关于开窗函数(over()):

开窗函数指定了分析函数中的分组的大小。

分析函数带有一个开窗函数over(),包含三个分析子句:分组(partition by), 排序(order by), 窗口(rows) ,这些就是窗口的规则。他们的使用形式如下:over(partition by xxx order by yyy rows between zzz)。

注意:窗口子句不能单独出现,必须有order by子句时才能出现。

聚合函数,分析函数和开窗函数结合使用的例子:

取出每月通话费最高和最低的两个地区:(例子原文:https://blog.csdn.net/haiross/article/details/15336313 来自:CSDN

SELECT BILL_MONTH, AREA_CODE,SUM(LOCAL_FARE) LOCAL_FARE,

FIRST_VALUE(AREA_CODE) OVER(PARTITION BY BILL_MONTH  ORDER BY SUM(LOCAL_FARE) DESC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FIRSTVAL, --按月分组,并统计该月的总和,取第一个

LAST_VALUE(AREA_CODE) OVER(PARTITION BY BILL_MONTH  ORDER BY SUM(LOCAL_FARE) DESC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) LASTVAL
FROM T
GROUP BY BILL_MONTH, AREA_CODE
ORDER BY BILL_MONTH

注:first_value()和last_value():在分析函数中使用,取首尾记录值

注:unbounded preceding and unbouned following针对当前所有记录的前一条、后一条记录,也就是表中的所有记录

unbounded:不受控制的,无限的

preceding:在...之前

following:在...之后

分析:先按照 bill_month和area_code分组:

SELECT BILL_MONTH,
AREA_CODE,
SUM(LOCAL_FARE) LOCAL_FARE
FROM T
GROUP BY BILL_MONTH, AREA_CODE
ORDER BY BILL_MONTH

得到结果如下:

然后用分析函数得到最大和最小值

oracle 分析函数和开窗函数的更多相关文章

  1. Oracle分析函数之开窗子句-即WINDOWING子句

    Oracle的分析函数,对我们进行统计有很大的帮助,可以避免一些子查询等操作,在统计中,我们对开窗函数的接触较少,下面主要介绍下开窗函数的使用; http://www.itpub.net/thread ...

  2. Oracle分析函数及常用函数: over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名

    (1)   函数:  over()的作用及用法:    -- 分区(分组)求和. sum() over( partition by column1 order by column2 )主要用来对某个字 ...

  3. Oracle 分析函数及常用函数

    什么叫分析函数(Analytic function)? Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组 ...

  4. Oracle中的over(partition by...)分析函数及开窗函数

    假设有一张表student Name  Score  InsertTime   (Name:姓名  Score:成绩 InsertTime:考试时间) 张三     20    2015-08-08 ...

  5. Oracle 分析函数之聚集函数(MAX、MIN、AVG和SUM)

    MAX 查找组中表达式的最大值 MAX(COL ) OVER ( [ <partition_by_clause> ] < order_by_clause > )MIN 查找组中 ...

  6. 开窗函数Over用法

    比如我们有这个表: 销售记录表 日期 姓名 产品 销售额 201601 A 电脑 12560 201601 A 手机 6501 201601 A 平板 8510 201602 A 手机 1560 20 ...

  7. oracle的分析函数over 及开窗函数

    转:http://www.2cto.com/database/201310/249722.html oracle的分析函数over 及开窗函数   一:分析函数over   Oracle从8.1.6开 ...

  8. oracle分析函数技术详解(配上开窗函数over())

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  9. 超级牛皮的oracle的分析函数over(Partition by...) 及开窗函数 (转)

    http://zonghl8006.blog.163.com/blog/static/4528311520083995931317/ over(Partition by...) 一个超级牛皮的ORAC ...

随机推荐

  1. 六 java和Tomcat

    Java企业级应用TOMCAT实战 http://blog.oldboyedu.com/java-tomcat/ 老男孩笔记 常规应用架构模型 Tomcat对静态请求效率低,可以做动静分离,动态的给T ...

  2. linux 服务器常用命令整理

    linux 服务器常用命令整理 目录 网络分析 - tcpdump \ telnet \ (netstat \ ss \ lsof) \ nload 网络传输 - scp \ rsync \ (rz ...

  3. Java操作ini文件 ,解决properties文件中无法读取换行及空格

    1.依赖jar包 ini4j-0.5.4.jar 2.官网 http://ini4j.sourceforge.net/ 3.测试例子 [java] view plain copy package cn ...

  4. swagger结合dubbo的rest服务测试

    swagger结合dubbo的rest服务测试 背景介绍 我们应用的dubbo服务导出,可能没有直接的触发点去发起调用测试,除非自己手写controller和test类,缺乏一个动态工具,类似流行的s ...

  5. 2019全国大学生信息安全竞赛初赛pwn前四题writeup—栈部分

    ret to libc技巧:https://blog.csdn.net/zh_explorer/article/details/80306965 如何leak出libc地址:基地址+函数在libc中的 ...

  6. Android Studio升级到3.4遇到的问题总结

    1.gradle需要升级. 1).project的build.gradle文件写下如下代码: buildscript { repositories { google() jcenter() } dep ...

  7. angular之指令

    指令(Directive) 1.指令概念介绍 --  AngularJS有一套完整的.可扩展的.用来帮助web应用开发的指令集. --  在DOM编译期间和HTML关联着的指令会被检测到,并且 会被执 ...

  8. 手写数字识别 ----在已经训练好的数据上根据28*28的图片获取识别概率(基于Tensorflow,Python)

    通过: 手写数字识别  ----卷积神经网络模型官方案例详解(基于Tensorflow,Python) 手写数字识别  ----Softmax回归模型官方案例详解(基于Tensorflow,Pytho ...

  9. 什么是HTTP及RFC

      HTTP:超文本传输协议(HyperText Transfer Protocol),是互联网上应用最为广泛的一种网络协议. 所有的www文件都必须遵守这个标准.设计HTTP最初的目的是为了提供发布 ...

  10. Cause: java. lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseInsertProvider

    相信现在Java Web开发都是用的mybatis吧,而用到mybatis很多人都不会错过通用mapper吧! (纯属瞎扯淡...qwq). 如我上一篇博客所写,目前公司新项目,使用了通用mapper ...