【Analytic】分析函式之RANK函式

secooler發表於2010-01-12
我們透過這個文章來看一下ROW_NUMBER函式的用法。這是一個很重要的分析函式,在得到分組排序前N條記錄和後N條記錄上有著自己的重要位置。
【Analytic】分析函式之MIN函式:http://space.itpub.net/519536/viewspace-624736
【Analytic】分析函式之MAX函式:http://space.itpub.net/519536/viewspace-624749
【Analytic】分析函式之AVG函式:http://space.itpub.net/519536/viewspace-624799
【Analytic】分析函式之ROW_NUMBER函式:http://space.itpub.net/519536/viewspace-624886

1.萬變不離其宗,先看RANK函式的語法描述。

RANK( )
   OVER ([ query_partition_clause ] order_by_clause)

2.透過實驗看一下RANK函式的使用方法
1)建立測試表T,並初始化9條資料。
sec@ora10g> create table t (group_id number(10), name varchar2(10), salary int);
sec@ora10g> insert into t values (1,'Tom',1200);
sec@ora10g> insert into t values (2,'Kary',2400);
sec@ora10g> insert into t values (2,'Joe',800);
sec@ora10g> insert into t values (3,'Erick',3600);
sec@ora10g> insert into t values (3,'Andy',600);
sec@ora10g> insert into t values (3,'Secooler',600);
sec@ora10g> insert into t values (3,'Hou',600);
sec@ora10g> insert into t values (3,'Mary',300);
sec@ora10g> insert into t values (3,'Ellen',200);
sec@ora10g> commit;

2)T表全貌
sec@ora10g> select * from t;

  GROUP_ID NAME                               SALARY
---------- ------------------------------ ----------
         1 Tom                                  1200
         2 Kary                                 2400
         2 Joe                                   800
         3 Erick                                3600
         3 Andy                                  600
         3 Secooler                              600
         3 Hou                                   600
         3 Mary                                  300
         3 Ellen                                 200

9 rows selected.

共三組資料,group_id分別是1、2和3。第1組有一個人,第2組有兩個人,第3組有六個人。最後一列是每個人的薪水值,注意第三組中的Andy、Secooler和Hou的薪水都是相同的。

3)分析函式RANK的基本使用方法
sec@ora10g> select group_id, name, salary, rank() over (PARTITION BY group_id ORDER BY salary) as rank from t;

  GROUP_ID NAME                               SALARY       RANK
---------- ------------------------------ ---------- ----------
         1 Tom                                  1200          1
         2 Joe                                   800          1
         2 Kary                                 2400          2
         3 Ellen                                 200          1
         3 Mary                                  300          2
         3 Hou                                   600          3
         3 Secooler                              600          3
         3 Andy                                  600          3
         3 Erick                                3600          6

9 rows selected.

可見,在資料的最後一列我們新增了RANK列,這一列可以得到每一分組人員薪酬從低到高的序號。不過細節不容錯過,重點請關注同組內薪酬相同的人,如Andy、Secooler和Hou,他們在第三組中的RANK都是3,緊跟其後的Erick的RANK突然變成了6,這是序號跳躍現象(以後我會給大家介紹分析函式DENSE_RANK,它就不會出現這種跳躍現象)。

3)分析函式RANK的一般使用場合
類似於分析函式ROW_NUMBER的作用,可以得到每組內的前N條或後N條記錄,便於資料的查詢與分析。
與ROW_NUMBER不同的是,分析函式RANK在遇到同組內值相同的記錄時,將會使用相同的數字進行標識,以示數值的相等。

3.小結
不同的統計場景將會選用不同的分析函式,一切隨需而變。這個世界上永遠不變的就是變化。
有關分析函式的擴充套件可以參考Oracle的官方文件中的“Analytic Functions”描述:

Good luck.

secooler
10.01.12

-- The End --

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

相關文章