分析函式——NULLS FIRST/LAST

呆呆笨笨的魚發表於2014-06-12
透過RANK()、DENSE_RANK()、ROW_NUMBER()對記錄進行全排列、分組排列取值

但有時候,會遇到空值的情況,空值會影響得到的結果的正確性
例:
銷售表:
SQL> select * from criss_sales;
 
DEPT_ID SALE_DATE   GOODS_TYPE    SALE_CNT
------- ----------- ---------- -----------
D01     2014/3/4    G00                700
D02     2014/3/6    G00                500
D01     2014/4/8    G01                200
D02     2014/4/27   G01                300
D01     2014/4/30   G03                800
D02     2014/5/2    G03                900
D01     2014/5/4    G02                 80
D02     2014/4/8    G02                100
D01     2014/6/12   G01        

SQL> select
  2    dept_id
  3   ,sale_date
  4   ,goods_type
  5   ,sale_cnt
  6   ,rank() over (partition by dept_id order by sale_cnt desc)
  7  from criss_sales
  8  ;
 
DEPT_ID SALE_DATE   GOODS_TYPE    SALE_CNT RANK()OVER(PARTITIONBYDEPT_IDO
------- ----------- ---------- ----------- ------------------------------
D01     2014/6/12   G01                                                 1
D01     2014/4/30   G03                800                              2
D01     2014/3/4    G00                700                              3
D01     2014/4/8    G01                200                              4
D01     2014/5/4    G02                 80                              5
D02     2014/5/2    G03                900                              1
D02     2014/3/6    G00                500                              2
D02     2014/4/27   G01                300                              3
D02     2014/4/8    G02                100                              4

我們可以看到部門D01中的銷售數量為NULL的記錄排名居然是第一,這顯然是不對的。

此時,就需要用到NULLS LAST來處理
處理後結果如下:
SQL> select
  2    dept_id
  3   ,sale_date
  4   ,goods_type
  5   ,sale_cnt
  6   ,rank() over (partition by dept_id order by sale_cnt desc nulls last)
  7  from criss_sales
  8  ;
 
DEPT_ID SALE_DATE   GOODS_TYPE    SALE_CNT RANK()OVER(PARTITIONBYDEPT_IDO
------- ----------- ---------- ----------- ------------------------------
D01     2014/4/30   G03                800                              1
D01     2014/3/4    G00                700                              2
D01     2014/4/8    G01                200                              3
D01     2014/5/4    G02                 80                              4
D01     2014/6/12   G01                                                 5
D02     2014/5/2    G03                900                              1
D02     2014/3/6    G00                500                              2
D02     2014/4/27   G01                300                              3
D02     2014/4/8    G02                100                              4

這樣就得到了期望的結果。

NULLS FIRST/LAST 可以幫助我們在處理含有空值的排序排列中,將空值欄位記錄放到最前或最後顯示,幫助我們得到期望的結果。







來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28929558/viewspace-1181121/,如需轉載,請註明出處,否則將追究法律責任。

相關文章