日期:2014-05-16  浏览次数:20372 次

ORACLE -- Oracle分析函数详述【二】

一.分析函数2(rank\dense_rank\row_number)

目录
===============================================
1.使用rownum为记录排名
2.使用分析函数来为记录排名
3.使用分析函数为记录进行分组排名

一、使用rownum为记录排名:

在前面一篇《Oracle开发专题之:分析函数》,我们认识了分析函数的基本应用,现在我们再来考虑下面几个问题:

①对所有客户按订单总额进行排名
②按区域和客户订单总额进行排名
③找出订单总额排名前13位的客户
④找出订单总额最高、最低的客户
⑤找出订单总额排名前25%的客户

按照前面第一篇文章的思路,我们只能做到对各个分组的数据进行统计,如果需要排名的话那么只需要简单地加上rownum不就行了吗?事实情况是否如此想象般简单,我们来实践一下。

【1】测试环境:
SQL> desc user_order;
Name????????????????????????????????????? Null???? Type
----------------------------------------- -------- ----------------------------
REGION_ID????????????????????????????????????????? NUMBER(2)
CUSTOMER_ID????????????????????????????????? NUMBER(2)
CUSTOMER_SALES????????????????????????? NUMBER

【2】测试数据:
SQL> select * from user_order order by customer_sales;

REGION_ID CUSTOMER_ID CUSTOMER_SALES
---------- ----------- --------------
???????? 5?????????? 1????????????? 151162
??????? 10????????? 29???????????? 903383
???????? 6?????????? 7????????????? 971585
??????? 10????????? 28??????????? 986964
???????? 9????????? 21?????????? 1020541
???????? 9????????? 22?????????? 1036146
???????? 8????????? 16?????????? 1068467
???????? 6?????????? 8??????????? 1141638
???????? 5?????????? 3??????????? 1161286
???????? 5?????????? 5??????????? 1169926
???????? 8????????? 19?????????? 1174421
???????? 7????????? 12?????????? 1182275
???????? 7????????? 11?????????? 1190421
???????? 6????????? 10?????????? 1196748
???????? 6?????????? 9??????????? 1208959
??????? 10????????? 30????????? 1216858
???????? 5???????????? 2??????????????? 1224992
?????????? 9???????????? 24????????????? 1224992
?????????? 9???????????? 23????????????? 1224992
?????????? 8????????? 18?????????? 1253840
???????? 7????????? 15?????????? 1255591
???????? 7????????? 13?????????? 1310434
??????? 10????????? 27????????? 1322747
???????? 8????????? 20?????????? 1413722
???????? 6?????????? 6??????????? 1788836
??????? 10????????? 26????????? 1808949
???????? 5?????????? 4??????????? 1878275
???????? 7????????? 14?????????? 1929774
???????? 8????????? 17?????????? 1944281
???????? 9????????? 25?????????? 2232703

30 rows selected.

注意这里有3条记录的订单总额是一样的。假如我们现在需要筛选排名前12位的客户,如果使用rownum会有什么样的后果呢?
SQL> select rownum, t.*
2??? from (select *
3??????????? from user_order
4?????????? order by customer_sales desc) t
5?? where rownum <= 12
6?? order by customer_sales desc;

??? ROWNUM REGION_ID CUSTOMER_ID CUSTOMER_SALES
---------- ---------- ----------- --------------
???????? 1????????? 9???????????????? 25??????? 2232703
???????? 2????????? 8???????????????? 17??????? 1944281
???????? 3????????? 7???????????????? 14??????? 1929774
???????? 4????????? 5?????????????????? 4??????? 1878275
???????? 5???????? 10??????????????? 26??????? 1808949
???????? 6????????? 6?????????????????? 6??????? 1788836
???????? 7????????? 8???????????????? 20??????? 1413722
???????? 8???????? 10??????????????? 27??????? 1322747
???????? 9????????? 7??????????????? 13??????? 1310434
??????? 10????????? 7?????????????? 15??????? 1255591
??????? 11????????? 8?????????????? 18??????? 1253840
????????? 12???????????? 5???????????????????? 2????????? 1224992

12 rows selected.