通过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 可以帮助我们在处理含有空值的排序排列中,将空值字段记录放到最前或最后显示,帮助我们得到期望的结果。
但有时候,会遇到空值的情况,空值会影响得到的结果的正确性
例:
销售表:
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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28929558/viewspace-1181121/