Oracle分析函數-keep(dense_rank first/last)

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

此時有個新需求,但願查看部門 D02 內,銷售記錄時間最先,銷售量最小的記錄。

即但願獲得這樣的信息
D02     2014/3/6    G01                430

這樣,就須要用keep(dense_rank first/last)來幫助處理oracle

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的狀況。
例子中:spa

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

這兩條記錄,同時知足keep的條件,經過 min(sale_cnt) 咱們就獲得了惟一的值 code

D02     2014/3/6    G01                430

下面咱們加上MAX 與 MIN對比下:blog

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這樣去作。
相關文章
相關標籤/搜索