over()分析函數(shù)用于計(jì)算基于組的某種聚合值侮腹,它和聚合函數(shù)的不同之處是:對于每個(gè)組返回多行,而聚合函數(shù)對于每個(gè)組只返回一行九府。
例子:
select *from (select name,class,score,rank() over(partition by class order by score desc) mm from t2 ) where mm=1
通過class班級進(jìn)行分組椎瘟,并根據(jù)score分?jǐn)?shù)進(jìn)行排序,用rank()函數(shù)排序方法為mm列賦予序號侄旬,然后mm=1就可以找到每組的第一名肺蔚,當(dāng)然可以根據(jù)score就行倒序可以找到最后一名。
row_number() over(partition by ... order by ...)
簡單的說row_number()從1開始儡羔,為每一條分組記錄返回一個(gè)數(shù)字宣羊, row_number() over(order by score desc)是先把score 列降序,再為降序以后的沒條xlh記錄返回一個(gè)序號汰蜘。(如果沒有分組可以理解成將整個(gè)結(jié)果作為一個(gè)分組)
row_number() over(partition by class order by score desc)表示根據(jù)class分組仇冯,在分組內(nèi)部根據(jù) score 排序,而此函數(shù)計(jì)算的值就表示每組內(nèi)部排序后的順序編號(組內(nèi)連續(xù)的唯一的)
rank() over(partition by ... order by ...)
dense_rank() over(partition by ... order by ...)
作為分?jǐn)?shù)函數(shù)中有關(guān)排序的rank(),dense_rank(),row_number()族操。
rank() over是的作用是查出指定條件后進(jìn)行一個(gè)排名苛坚,但是有一個(gè)特點(diǎn)。假如是對學(xué)生排名坪创,那么實(shí)用這個(gè)函數(shù)炕婶,成績相同的兩名是并列(名次為1,2,2,4)
dense_rank()的作用和rank()很像姐赡,唯一區(qū)別就是莱预,相同成績并列以后,下一位同學(xué)并不空出并列所占的名次(名次為1,2,2,3)
row_number()就不一樣了项滑,它和上面兩種的區(qū)別就很明顯了依沮,這個(gè)函數(shù)不需要考慮是否并列,哪怕根據(jù)條件查詢出來的數(shù)值相同也會進(jìn)行連續(xù)排名枪狂。
對于多表查詢危喉,可以為空置加上一個(gè)判斷來顯示查詢數(shù)據(jù)為空的數(shù)據(jù)。
case when score is null then 1 else rank() over (partition by class order by score desc ) end as mm
其他常用的分析函數(shù):
count() over(partition by ... order by ...) max() over(partition by ... order by ...) min() over(partition by ... order by ...) sum() over(partition by ... order by ...) avg() over(partition by ... order by ...) first_value() over(partition by ... order by ...) last_value() over(partition by ... order by ...) lag() over(partition by ... order by ...) lead() over(partition by ... order by ...)