Oracle分析函数-keep(dense_rank first/last)
此時有個新需求,希望查看部門 D02 內,銷售記錄時間最早,銷售量最小的記錄。
即希望得到這樣的信息
D02 ? ? 2014/3/6 ? ?G01 ? ? ? ? ? ? ? ?430
這樣,就需要用keep(dense_rank first/last)來幫助處理
關于使用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的情況。
例子中:
這兩條記錄,同時滿足keep的條件,通過 min(sale_cnt) 我們就得到了唯一的值?
D02 2014/3/6 G01 430下面我們加上MAX 與 MIN對比下:
selectdept_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的情況吧
換成rank以后直接報錯了,至于原因,我的理解是rank不能表示記錄排序的相對順序
? 例如: 記錄 ? rank ? dense_rank
? ? ? ? ? 100 ? ?1 ? ? 1
? ? ? ? ? 100 ? ?1 ? ? 1
? ? ? ? ? 95 ? ? 3 ? ? 2
第三條記錄與第一條和第二條記錄的相對位置應該差1,但是用rank無法表示這一點。
感覺rank應該也能實現first/last的篩選,但是oracle似乎并沒允許用rank這樣去做。
轉載于:https://www.cnblogs.com/sooner/p/7729708.html
總結
以上是生活随笔為你收集整理的Oracle分析函数-keep(dense_rank first/last)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20169210 2016-2017-2
- 下一篇: Centos7 systemctl使用