SQL中row_number()?over(partition?by)的用法說明
row_number 語法
ROW_NUMBER()函數(shù)將針對(duì)SELECT語句返回的每一行,從1開始編號(hào),賦予其連續(xù)的編號(hào)。在查詢時(shí)應(yīng)用了一個(gè)排序標(biāo)準(zhǔn)后,只有通過編號(hào)才能夠保證其順序是一致的,當(dāng)使用ROW_NUMBER函數(shù)時(shí),也需要專門一列用于預(yù)先排序以便于進(jìn)行編號(hào)
partition by關(guān)鍵字是分析性函數(shù)的一部分,它和聚合函數(shù)不同的地方在于它能返回一個(gè)分組中的多條記錄,而聚合函數(shù)一般只有一條反映統(tǒng)計(jì)值的記錄,partition by用于給結(jié)果集分組,如果沒有指定那么它把整個(gè)結(jié)果集作為一個(gè)分組,分區(qū)函數(shù)一般與排名函數(shù)一起使用。
原始表score
s_id 表是學(xué)生編號(hào),c_id表是課程編號(hào),s_score 表是學(xué)生對(duì)應(yīng)的課程分?jǐn)?shù)
1.要求:得出每門課程的學(xué)生成績(jī)排序(升序)
----因?yàn)槭敲块T課程的結(jié)果,并且要排序,所以用row_number
select * ,row_number() over (partition by c_id order by s_score) from score;
返回結(jié)果:
2:進(jìn)一步要求:得出每門課程的學(xué)生成績(jī),并且按照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;
返回結(jié)果:
row_number() over(partition by 列名1 order by 列名2 desc)的使用
表示根據(jù) 列名1 分組,然后在分組內(nèi)部根據(jù) 列名2 排序,而此函數(shù)計(jì)算的值就表示每組內(nèi)部排序后的順序編號(hào),可以用于去重復(fù)值
與rownum的區(qū)別在于:使用rownum進(jìn)行排序的時(shí)候是先對(duì)結(jié)果集加入偽列rownum然后再進(jìn)行排序,而此函數(shù)在包含排序從句后是先排序再計(jì)算行號(hào)碼.
---查詢所有姓名,如果同名,則按年齡降序
SELECT?name,age,detail,ROW_NUMBER()?OVER(PARTITION?BY?name?ORDER?BY?age?DESC)?FROM?TEST_Y;
通過上面的語句可知,是按照name字段分組,按age字段排序的。
如果只需查詢出不重復(fù)的姓名即可,則可使用如下的語句, 由查詢結(jié)果可知,姓名相同年齡小的數(shù)據(jù)被過濾掉了;
SELECT ? * ? FROM ? ( SELECT ? name ,age, detail ,ROW_NUMBER() ? OVER ( ? PARTITION ? BY ? name? ORDER ? BY ? age? DESC )RN ? FROM ? TEST_Y ) WHERE ? RN= ? 1 ;
分頁
--先做一個(gè)子查詢,先按id1進(jìn)行排序,排序完后,給每條記錄進(jìn)行了編號(hào)
--然后再將子查詢做為一張表,就可以進(jìn)行分頁了
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
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 使用row_number()實(shí)現(xiàn)分頁實(shí)例
- oracle中rownum和row_number()
- 利用ROW_NUMBER() OVER函數(shù)給SQL數(shù)據(jù)庫中每一條記錄分配行號(hào)的方法
- Mysql row number()排序函數(shù)的用法和注意
- SQL中distinct 和 row_number() over() 的區(qū)別及用法
- MYSQL row_number()與over()函數(shù)用法詳解
- SQL使用ROW_NUMBER() OVER函數(shù)生成序列號(hào)
- MySQL中rank() over、dense_rank() over、row_number() over用法介紹
- Row_number()函數(shù)用法小結(jié)
- 數(shù)據(jù)庫中row_number() 分組排序函數(shù)的具體使用
相關(guān)文章
MySQL?數(shù)據(jù)備份和數(shù)據(jù)恢復(fù)的實(shí)現(xiàn)
數(shù)據(jù)恢復(fù)的過程包括將備份文件導(dǎo)入到數(shù)據(jù)庫中、重建索引、應(yīng)用日志等,本文主要介紹了MySQL數(shù)據(jù)備份和數(shù)據(jù)恢復(fù)的實(shí)現(xiàn),感興趣的可以了解一下2023-08-08詳解MySQL存儲(chǔ)過程參數(shù)有三種類型(in、out、inout)
MySQL 存儲(chǔ)過程參數(shù)有三種類型:in、out、inout。它們各有什么作用和特點(diǎn)呢2012-07-07MYSQL中常用的強(qiáng)制性操作(例如強(qiáng)制索引)
對(duì)于經(jīng)常使用oracle的朋友可能知道,oracle的hint功能種類很多,對(duì)于優(yōu)化sql語句提供了很多方法。同樣,在mysql里,也有類似的hint功能。2014-05-05