分析函式rank() row_number
很早之前就聽網友談過oracle的分析函式的好處,這兩天有些需求不然不覺中用到了分析函式。
分析函式和聚合函式根本不同之處在於聚合函式sum average max min count等只能返回一行,而分析函式可以按組返回多行。
開窗函式的理解:也就是over(partition by class order by s),開窗函式指定了分析函式工作的視窗大小。(具體開窗函式中一些幅度值限制可以參考tom的export one-on-one)
create table student(name varchar2(10),class number,s number)
然後插入一些資料,例如此時student表中的資料:
select * from student
name class s
as 1 94
sd 2 78
fg 1 95
rtgh 3 88
df 2 90
vb 3 89
tyu 3 95
此時如果需要按班級分組分別按成績排名,如果不用分析函式個人真還不知道有什麼辦法。
Select name,class,s,rank()over(partition by class order by s desc) mingci from student
Mingci
fg 1 95 1
as 1 94 2
df 2 90 1
sd 2 78 2
tyu 3 95 1
vb 3 89 2
rtgh 3 88 3
當時想了半天的需求一個分析函式就ok了。而且效能上比一般的巢狀sql效能高。
其實剛接觸時對於後面的rank()over(partition by class order by s desc) mingci不是很理解,發其實也就是對查詢的結果按照分析要求賦值mingci,從1開始遞增排名。
Dense_ranke()函式和rank函式基本一樣,一點不同是:Rank是跳躍式的,dense_rank沒有跳躍。
如果只想查處每班成績第二名的學生資訊
Select * from (select name,class,s,rank()over(partition by class order by s desc) mingci from student) where mingci=2
分析函式中可以加partition by column_name具體某列來分組,去掉partition by column_name後會不分組全部排名。
Row_number()函式返回資料行的資訊,並沒有排名。
其實也不好表達,直接來sql吧直觀。
Select name,class,s from (select name,class,s,row_number()over(partition by class order by s) id from student) where id<=2
fg 1 95
as 1 94
df 2 90
sd 2 78
tyu 3 95
vb 3 89
rank排名顯示,row_number返回資料行資訊,如果上面的name,class,s改為* ,也會顯示巢狀表中的ID。(感覺和rank差不多啊。)
簡單的分享了分析函式用法,當然只是很小的一部分。晚了 睡覺了!
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1055251/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- rank,dense_rank,row_number 分析函式函式
- oracle分析函式Rank, Dense_rank, row_numberOracle函式
- 分析函式——排序排列(rank、dense_rank、row_number)函式排序
- oracle 分析函式之(rank()/dense_rank()/row_number())Oracle函式
- Spark2 Dataset分析函式--排名函式row_number,rank,dense_rank,percent_rankSpark函式
- 分析函式rank,dense_rank,row_number使用和區別 .函式
- 分析函式中rank(),row_number(),dense_rank()的區別函式
- SQL SERVER 排序函式ROW_NUMBER、RANK、DENSE_RANK、NTILESQLServer排序函式
- lead lag rank()over()dense_rank()row_number()over()rollupcube幾大分析函式函式
- Oracle分析函式RANK(),ROW_NUMBER(),LAG()等的使用方法(轉)Oracle函式
- 分析函式DENSE_RANK 和 RANK函式
- 【Analytic】分析函式之RANK函式函式
- 【SQL 學習】分析函式之RANK() DENSE_RANK ()SQL函式
- 【Analytic】分析函式之DENSE_RANK函式函式
- 【Analytic】分析函式之ROW_NUMBER函式函式
- Oracle 中分析函式用法之--rank(),dense_rank(),partition,over()Oracle函式
- Oracle:Rank,Dense_Rank,Row_Number比較Oracle
- 分析函式——keep(dense_rank first/last)函式AST
- ROW_NUMBER() OVER() 分析函式的用法函式
- 分析函式學習3 ROW_NUMBER函式
- 分析函式row_number()使用一例函式
- RANK函式小結函式
- Hive中row_number()、dense_rank()、rank()的區別Hive
- row_number() over,rank() over,dense_rank() over的區別
- SQL語句中的rank () over , row_number() over ,rank_dense ()SQL
- row_number() over函式函式
- Oracle vs PostgreSQL Develop(14) - 分析函式KEEP DENSE_RANKOracleSQLdev函式
- Oracle 中的 ROW_NUMBER() OVER() 分析函式的用法Oracle函式
- 【函式】Oracle中聚合函式rank()使用方法函式Oracle
- [原創] 小議rank(),dense_rank(),row_number()使用與區別
- 【SQL】Lag/Rank/Over視窗函式揭秘,資料分析之旅SQL函式
- oracle中聚合函式RANK和dense_rank的使用(轉)Oracle函式
- 有關oracle中聚合函式rank和dense_rank的使用Oracle函式
- rank() 與dense_rank()分析
- CUME-DIST()和PERCENT-RANK()函式函式
- ROW_NUMBER() OVER函式的基本用法函式
- MySQL自定義變數實現row_number分析函式的天坑MySql變數函式
- RANK函式基於條件的查詢函式