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 vs PostgreSQL Develop(14) - 分析函式KEEP DENSE_RANKOracleSQLdev函式
- Oracle分析函式之開窗函式over()詳解Oracle函式
- 【SQL】Lag/Rank/Over視窗函式揭秘,資料分析之旅SQL函式
- 7.78 DENSE_RANK
- Hive ROW_NUMBER,RANK(),DENSE_RANK()Hive
- Hive中row_number()、dense_rank()、rank()的區別Hive
- sql(oracle)資料處理實用總結開窗函式(over partition)使用SQLOracle函式
- 分割槽函式Partition By的基本用法函式
- 分割槽函式partition by的基本用法【轉載】函式
- oracle資料庫常用分析函式與聚合函式的用法Oracle資料庫函式
- 【Oracle的NVL函式用法】Oracle函式
- ROWNUMBER() OVER( PARTITION BY COL1
- 分析函式系列之sum(col1) over(partition by col2 order by col3):實現分組彙總或遞增彙總函式
- Oracle分析函式與視窗函式Oracle函式
- oracle 21c 新特性之 CHECKSUM 分析函式Oracle函式
- PHP 手冊中的匿名函式關聯用法分析PHP函式
- Python函式用法和底層分析Python函式
- Oracle分析函式之LEAD和LAG實際應用Oracle函式
- Rust中Turbofish之函式後面雙冒號(::)用法Rust函式
- ORACLE分析函式手冊(轉)Oracle函式
- python中zip()函式的用法Python函式
- Matlab中erf函式的用法Matlab函式
- Spark Streaming--開窗函式over()Spark函式
- ORACLE分析函式手冊二(轉)Oracle函式
- Python中的split()函式的用法Python函式
- PyThon range()函式中for迴圈用法Python函式
- C++中函式呼叫的用法C++函式
- abs函式用法函式
- Oracle報performing DMLDDL operation over object in bin案例分析OracleORMObject
- Oracle中pivot函式詳解Oracle函式
- 工作中,Oracle常用函式Oracle函式
- Oracle中Decode()函式的使用Oracle函式
- oracle partition by 語法Oracle
- oracle 函式Oracle函式
- oracle or 函式Oracle函式
- Linux中select()函式分析Linux函式
- Python range() 函式用法Python函式
- SSD-函式用法函式