首頁 > 軟體

SQL中row_number() over(partition by)的用法說明

2022-07-11 18:04:17

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com