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;