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这样去做。

最新文章

  1. Beta版本冲刺第一天
  2. 从零开始编写自己的C#框架(9)——数据库设计与创建
  3. How to use groovy script on jenkins
  4. MySQL服务 - MySQL列类型、SQL模式、数据字典
  5. Emit学习(2) - IL - 常用指令介绍
  6. 【pom.xml 依赖】使用net.sf.json-lib-2.4-jdk15.jar所需要的其他依赖架包 以及其一直在pom.xml报错的问题
  7. 使用adb 查询data/data下的数据库
  8. iOS开发----调用地图导航
  9. Webservice发布出现 测试窗体只能用于来自本地计算机的请求
  10. 汉诺塔算法的递归与非递归的C以及C++源代码
  11. 实例:图形绘制[OpenCV 笔记15]
  12. wchar_t 、UTF-8、UTF-16的转换方法 - luketty的专栏 - 博客频道 - CSDN.NET
  13. Intellij IDEA 2016 mybatis 生成 mapper
  14. storm.yaml 配置项
  15. Git仓库创建和文件提交
  16. 【C#】发票助手二维码生成
  17. 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字
  18. 第45章:MongoDB-集群--Sharding(分片)--分片的管理
  19. 中间件 activeMQ Jms Java Demo
  20. Apache IOUtils的使用

热门文章

  1. 2602 ACM 杭电 骨头容器 01背包
  2. BUG——Celery ValueError: not enough values to unpack
  3. webView加载url,加载指定字符串
  4. Java中map集合系列原理剖析
  5. 小甲鱼python第二讲课后习题
  6. Codeforces899D Shovel Sale(思路)
  7. JSOUP 打开url的方式
  8. Spring Data JPA使用getOne方法报错:Method threw 'org.hibernate.LazyInitializationException' exception. Cannot evaluate
  9. 00、Word Count
  10. 【转】Selenium - 封装WebDrivers (C#)