ITPub博客

首页 > 数据库 > Oracle > 分析函数——NULLS FIRST/LAST

分析函数——NULLS FIRST/LAST

原创 Oracle 作者:呆呆笨笨的鱼 时间:2014-06-12 10:58:05 0 删除 编辑
通过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博客 ” ,链接:https://blog.itpub.net/28929558/viewspace-1181121/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-04-17

  • 博文量
    62
  • 访问量
    939480