Oracle 中分析函式用法之--rank(),dense_rank(),partition,over()
rank()對錶中資料進行分級排序
比如有張學生表:Student
SQL> conn scott/tiger
Connected.
SQL> desc student;
Name Null? Type
----------------------------------------- -------- ----------------------------
NAME VARCHAR2(10)
SUBJECT VARCHAR2(20)
GRADE NUMBER
SQL> SELECT * FROM student ORDER BY subject;
NAME SUBJECT GRADE
---------- -------------------- ----------
zhangsan chinses 90
lisi chinses 94
wang chinses 85
zhangsan english 75
lisi english 89
zhangsan maths 80
lisi maths 72
lisi maths 98
8 rows selected.
如果要想得到表中chinses 、english和maths各前兩名的成績,
那麼可以通過rank()函式實現
--首先通過subject分類,然後通過grade列降序
SQL> SELECT rank() over(partition by subject order by grade desc) rk,s.* FROM student s;
RK NAME SUBJECT GRADE
---------- ---------- -------------------- ----------
1 lisi chinses 94
2 zhangsan chinses 90
3 wang chinses 85
1 lisi english 89
2 zhangsan english 75
1 lisi maths 98
2 zhangsan maths 80
3 lisi maths 72
8 rows selected.
然後再加過濾條件rk<=2
SQL> SELECT * FROM
2 (SELECT rank() over(partition by subject order by grade desc) rk,s.* FROM student s)
3 tmptb
4 WHERE tmptb.rk<=2;
RK NAME SUBJECT GRADE
---------- ---------- -------------------- ----------
1 lisi chinses 94
2 zhangsan chinses 90
1 lisi english 89
2 zhangsan english 75
1 lisi maths 98
2 zhangsan maths 80
6 rows selected.
dense_rank()的用法,取科目為chinses的前兩名成績
"afiedt.buf" 9L, 138C written
1 SELECT *
2 FROM (
3 SELECT name,subject,grade,
4 dense_rank() over(ORDER BY grade DESC) rn
5 FROM student
6 WHERE subject='chinses'
7 )
8* WHERE rn<=2
SQL> /
NAME SUBJECT GRADE RN
---------- -------------------- ---------- ----------
lisi chinses 94 1
zhangsan chinses 90 2
row_number()的使用
SQL> SELECT row_number() over(order by grade desc) rk,s.* FROM student s;
RK NAME SUBJECT GRADE
---------- ---------- -------------------- ----------
1 lisi maths 98
2 lisi chinses 94
3 zhangsan chinses 90
4 lisi english 89
5 wang chinses 85
6 zhangsan maths 80
7 zhangsan english 75
8 lisi maths 72
8 rows selected.
取所有人的前3名
SQL> SELECT *
2 FROM (
3 SELECT row_number() over(order by grade desc) rk,s.* FROM student s
4 )
5 WHERE rk<=3;
RK NAME SUBJECT GRADE
---------- ---------- -------------------- ----------
1 lisi maths 98
2 lisi chinses 94
3 zhangsan chinses 90
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16400082/viewspace-693044/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql自動排序函式dense_rank() over()、rank() over()、row_num() over()用法和區別MySql排序函式
- oracle 分析函式之(rank()/dense_rank()/row_number())Oracle函式
- lead lag rank()over()dense_rank()row_number()over()rollupcube幾大分析函式函式
- oracle分析函式Rank, Dense_rank, row_numberOracle函式
- 分析函式DENSE_RANK 和 RANK函式
- 【SQL 學習】分析函式之RANK() DENSE_RANK ()SQL函式
- OVER(PARTITION BY)函式用法函式
- 【Analytic】分析函式之DENSE_RANK函式函式
- rank,dense_rank,row_number 分析函式函式
- oracle中聚合函式RANK和dense_rank的使用(轉)Oracle函式
- 分析函式中rank(),row_number(),dense_rank()的區別函式
- row_number() over,rank() over,dense_rank() over的區別
- 有關oracle中聚合函式rank和dense_rank的使用Oracle函式
- 分析函式——排序排列(rank、dense_rank、row_number)函式排序
- Oracle vs PostgreSQL Develop(14) - 分析函式KEEP DENSE_RANKOracleSQLdev函式
- 分析函式——keep(dense_rank first/last)函式AST
- oracle的分析函式over(Partition by...) 及開窗函式Oracle函式
- Spark2 Dataset分析函式--排名函式row_number,rank,dense_rank,percent_rankSpark函式
- 分析函式rank,dense_rank,row_number使用和區別 .函式
- Oracle 中的 ROW_NUMBER() OVER() 分析函式的用法Oracle函式
- rank() 與dense_rank()分析
- (轉)Oracle語法之OVER(PARTITION BY)及開窗函式Oracle函式
- Oracle統計分析函式集,over(partition by..) 的運用Oracle函式
- SQL SERVER 排序函式ROW_NUMBER、RANK、DENSE_RANK、NTILESQLServer排序函式
- Oracle 語法之 OVER (PARTITION BY ..) 及開窗函式 轉載Oracle函式
- 【Analytic】分析函式之RANK函式函式
- Oracle分析函式之開窗函式over()詳解Oracle函式
- ROW_NUMBER() OVER() 分析函式的用法函式
- Oracle:Rank,Dense_Rank,Row_Number比較Oracle
- 【函式】Oracle中聚合函式rank()使用方法函式Oracle
- 分析函式 over函式
- oracle的分析函式over 及開窗函式Oracle函式
- 語法:OVER(PARTITION BY)及開窗函式函式
- oracle分析函式,keep and over解說Oracle函式
- sum()over()和count()over()分析函式函式
- Hive中row_number()、dense_rank()、rank()的區別Hive
- Oracle over()函式使用Oracle函式
- oracle聚合函式rank()的用法和一些體會Oracle函式