select * from criss_sales where dept_id = 'D02' order by sale_date ;

此时有个新需求,希望查看部门 D02 内,销售记录时间最早,销售量最小的记录。

即希望得到这样的信息
D02     2014/3/6    G01                430

这样,就需要用keep(dense_rank first/last)来帮助处理

select
dept_id
,min(sale_cnt)keep ( dense_rank first order by sale_date) min_early_date
from criss_sales
where dept_id = 'D02'
group by dept_id;

关于使用keep(dense_rank first/last) 会有一些疑问
1.keep(dense_rank first/last) 这句话的含义是什么?
2.为什么要使用min ?
3.为什么使用dense_rank ? rank不可以吗?

关于问题1:
  keep 字面意思就是'保持',也就是说保存满足keep()括号内条件的记录
       这里我们应该可以想象到,会有多条记录的情况,即存在多个last或first的情况)
  dense_rank 是排序策略
  first/last 是筛选策略
  
关于问题2:
使用min的原因是让最后得到的结果唯一,因为有时会存在多个last或first的情况。
例子中:

DEPT_ID SALE_DATE   GOODS_TYPE    SALE_CNT
------- ----------- ---------- -----------
D02 2014/3/6 G00 500
D02 2014/3/6 G01 430

这两条记录,同时满足keep的条件,通过 min(sale_cnt) 我们就得到了唯一的值

D02     2014/3/6    G01                430

下面我们加上MAX 与 MIN对比下:

select
dept_id
,min(sale_cnt)keep ( dense_rank first order by sale_date) min_early_date
,max(sale_cnt)keep ( dense_rank first order by sale_date) max_early_date
from criss_sales
where dept_id = 'D02'
group by dept_id;

很显然 max 取到了两条记录的较大值!

关于问题3:
先看一下换成rank的情况吧

select
dept_id
,min(sale_cnt)keep ( rank first order by sale_date) min_early_date
,max(sale_cnt)keep ( rank first order by sale_date) max_early_date
from criss_sales
where dept_id = 'D02'
group by dept_id;

ORA-02000: 缺失 DENSE_RANK 关键字

换成rank以后直接报错了,至于原因,我的理解是rank不能表示记录排序的相对顺序
  例如: 记录   rank   dense_rank
          100    1     1
          100    1     1
          95     3     2
第三条记录与第一条和第二条记录的相对位置应该差1,但是用rank无法表示这一点。
感觉rank应该也能实现first/last的筛选,但是oracle似乎并没允许用rank这样去做。

Oracle分析函数-keep(dense_rank first/last)的更多相关文章

  1. [转]oracle分析函数Rank, Dense_rank, row_number

    oracle分析函数Rank, Dense_rank, row_number 分析函数2(Rank, Dense_rank, row_number)   目录 ==================== ...

  2. Oracle分析函数 — rank, dense_rank, row_number用法

    本文通过例子演示了Oracle分析函数 —— rank, dense_rank, row_number的用法. //首先建score表 create table score( course   nva ...

  3. oracle分析函数Rank, Dense_rank, row_number

    http://www.cnblogs.com/wuyisky/archive/2010/02/24/oracle_rank.html 目录=============================== ...

  4. oracle 分析函数 keep(dense_rank first/last)

    SQL : select * from crisis_sales where dept_id = 'D02' order by sale_date; DEPT_ID  SALE_DATE  GOODS ...

  5. [转]oracle 分析函数over

      oracle 分析函数over 分析函数(OVER) 目录: =============================================== 1.Oracle分析函数简介 2. O ...

  6. oracle分析函数与over()(转)

    文章参考:http://blog.csdn.net/haiross/article/details/15336313 -- Oracle分析函数入门-- 分析函数是什么? 分析函数是Oracle专门用 ...

  7. 常用Oracle分析函数详解 [http://www.cnblogs.com/benio/archive/2011/06/01/2066106.html]

      学习步骤:1. 拥有Oracle EBS demo 环境 或者 PROD 环境2. copy以下代码进 PL/SQL3. 配合解释分析结果4. 如果网页有点乱请复制到TXT中查看 /*假设一个经理 ...

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

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

  9. Oracle分析函数——函数列表

    --------------聚合函数 SUM :该函数计算组中表达式的累积和 MIN :在一个组中的数据窗口中查找表达式的最小值 MAX :在一个组中的数据窗口中查找表达式的最大值 AVG :用于计算 ...

随机推荐

  1. JS字符串截取(获取指定字符后面的所有字符内容)

    function getCaption(obj){     var index=obj.lastIndexOf("\-");     obj=obj.substring(index ...

  2. 小型资源管理器之动态添加TreeView节点

    FrmMain主界面 using System; using System.Collections.Generic; using System.ComponentModel; using System ...

  3. STM32(HY-SRF05)超声波测距项目

    参考资料: https://www.cnblogs.com/qsyll0916/p/6964638.html http://blog.csdn.net/zhangdaxia2/article/deta ...

  4. [POI2012]Tour de Bajtocja

    [POI2012]Tour de Bajtocja 题目大意: 给定一个\(n(n\le10^6)\)个点\(m(m\le2\times10^6)\)条边的无向图,问最少删掉多少条边能使得编号小于等于 ...

  5. [P2921][USACO08DEC]在农场万圣节Trick or Treat on the Farm (记忆化搜索/DP?,Tarjan?)

    第一看还以为是水题 随便打了一个bfs只有40分…… 然后开始颓废 #include<bits/stdc++.h> #define N 100005 using namespace std ...

  6. angular.copy()

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. javascript对样式的操作

    js可实现用户对页面中的选择条件改变页面中的样式,页面样式可以通过style修饰,也可以通过css修饰,先来看一下js改变style样式,代码如下: 案例一: <!DOCTYPE html> ...

  8. MyEclipse 2015 SVN 安装

    SVN的在线安装 1.打开MyEclipse,找到顶部菜单栏 Help(帮助)-Install from Site…(从网站安装),如下图 2. 点击Install from Site…后会出现让你选 ...

  9. Mac下的Jenkins安装

    安装方式 1)通过命令行安装   brew install jenkins,可能会遇到先更新 brew 的情况  https://brew.sh/index_zh-cn: 2)通过 pkg 安装,官方 ...

  10. wordclock中文模式快一个小时怎么调整

    wordclock屏幕保护,设置为中文模式,显示的时间比系统时间要快一个小时,其实软件自带的配置文件可以设置调整到正常时间……   工具/原料   wordclock 方法/步骤     桌面上右键菜 ...