作者:李康康 邮箱:liakngkang@126.com
Oracle从8.1.6引入分析函数,可以更快速、更方便的实现业务需求比较复杂的sql。其中包括:
1. 有关行号的分析函数:rank() dense_rank() row_number()
2. 类似于聚合函数的分析函数sum() avg() max() min()
3. 取某行某列数据的分析函数lag() lead()
4. 取首位行某列的分析函数first_Value() last_value()
今天先看一下有关行号的分析函数
Rank():有重号且跳号
Dense_rank():有重号不跳号
Row_number():无重号不跳号
它们与rownum的区别是,rownum表示的是row source的序号,而以上分析函数返回的序号取决于over之后的分组排序信息,看以下例子便可一目了然:
源数据为:
SQL> select * from stu;
ID NAME CLASS
---------- ---------- ----------
1 a 10
1 b 10
2 c 10
2 d 10
3 e 10
4 f 20
5 g 20
6 h 20
6 i 20
9 rows selected.
以下sql可以很容易的看出几者的区别:
SQL> select id,name,class,
2 rank() over(partition by class order by id) rank,
3 dense_rank() over(partition by class order by id) dense_rank,
4 row_number() over(partition by class order by id) row_number,
5 rownum
6 from stu;
ID NAME CLASS RANK DENSE_RANK ROW_NUMBER ROWNUM
---------- ---------- ---------- ---------- ---------- ---------- ----------
1 a 10 1 1 1 1
1 b 10 1 1 2 2
2 c 10 3 2 3 3
2 d 10 3 2 4 4
3 e 10 5 3 5 5
4 f 20 1 1 1 6
5 g 20 2 2 2 7
6 h 20 3 3 3 8
6 i 20 3 3 4 9
9 rows selected.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23089850/viewspace-663713/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23089850/viewspace-663713/