SQL中row_number()?over(partition?by)的用法說明
row_number 語法
ROW_NUMBER()函數將針對SELECT語句返回的每一行,從1開始編號,賦予其連續的編號。在查詢時應用了一個排序標準后,只有通過編號才能夠保證其順序是一致的,當使用ROW_NUMBER函數時,也需要專門一列用于預先排序以便于進行編號
partition by關鍵字是分析性函數的一部分,它和聚合函數不同的地方在于它能返回一個分組中的多條記錄,而聚合函數一般只有一條反映統計值的記錄,partition by用于給結果集分組,如果沒有指定那么它把整個結果集作為一個分組,分區函數一般與排名函數一起使用。
原始表score
s_id 表是學生編號,c_id表是課程編號,s_score 表是學生對應的課程分數
1.要求:得出每門課程的學生成績排序(升序)
----因為是每門課程的結果,并且要排序,所以用row_number
select * ,row_number() over (partition by c_id order by s_score) from score;
返回結果:
2:進一步要求:得出每門課程的學生成績,并且按照70分作為分割線排序—即低于70分的排序,高于70分的排序
select * ,row_number() over (partition by c_id,(case when s_score>70 then 1 else 0 end) order by s_score) from score;
返回結果:
row_number() over(partition by 列名1 order by 列名2 desc)的使用
表示根據 列名1 分組,然后在分組內部根據 列名2 排序,而此函數計算的值就表示每組內部排序后的順序編號,可以用于去重復值
與rownum的區別在于:使用rownum進行排序的時候是先對結果集加入偽列rownum然后再進行排序,而此函數在包含排序從句后是先排序再計算行號碼.
---查詢所有姓名,如果同名,則按年齡降序
SELECT?name,age,detail,ROW_NUMBER()?OVER(PARTITION?BY?name?ORDER?BY?age?DESC)?FROM?TEST_Y;
通過上面的語句可知,是按照name字段分組,按age字段排序的。
如果只需查詢出不重復的姓名即可,則可使用如下的語句, 由查詢結果可知,姓名相同年齡小的數據被過濾掉了;
SELECT ? * ? FROM ? ( SELECT ? name ,age, detail ,ROW_NUMBER() ? OVER ( ? PARTITION ? BY ? name? ORDER ? BY ? age? DESC )RN ? FROM ? TEST_Y ) WHERE ? RN= ? 1 ;
分頁
--先做一個子查詢,先按id1進行排序,排序完后,給每條記錄進行了編號
--然后再將子查詢做為一張表,就可以進行分頁了
select * ? from (select t.*,row_number() over(order by t.id1 asc) as rn from demo t) d ? where d.rn between 1 and 2
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持本站。
版權聲明:本站文章來源標注為YINGSOO的內容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網站,禁止在非www.333abb.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內容來源于網友推薦、互聯網收集整理而來,僅供學習參考,不代表本站立場,如有內容涉嫌侵權,請聯系alex-e#qq.com處理。