SQL奇技淫巧(01):給查出的數(shù)據(jù)排序編個(gè)號【row_number() over(order by c)】(mysql,db2,oracle,sqlserver通用)

我們天天都在跟數(shù)據(jù)庫打交道当犯,寫下的代碼不計(jì)其數(shù)款侵,寫下的SQL更是可以繞地球幾圈。這里收集關(guān)于SQL的神奇語法及用法湃累,雖然你可能沒有用過勃救,但這些SQL卻可以在關(guān)鍵的時(shí)候,派上用場治力。

我對SQL語句的理解蒙秒,可以比作一座橋梁,將零散的數(shù)據(jù)組合起來宵统,拿到我所需要的有效信息晕讲。也以此記錄一下使用心得

一. 語法及基礎(chǔ)用法

注意: row_number()不能單獨(dú)使用,需要和over(order by col)一起使用马澈。

語法1:

row_number() over(ORDER BY col)

意思:簡單的說row_number()從1開始瓢省,為每一條分組記錄返回一個(gè)數(shù)字,這里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序痊班,再為降序以后的每條xlh記錄返回一個(gè)序號净捅。


語法2:

row_number() over(PARTITION BY col1 ORDER BY col2)

意思:表示根據(jù)col1分組,在分組內(nèi)部根據(jù) col2排序辩块,而此函數(shù)計(jì)算的值就表示每組內(nèi)部排序后的順序編號(組內(nèi)連續(xù)的唯一的)

關(guān)于Parttion by:

Parttion by關(guān)鍵字是SQL中分析性函數(shù)的一部分,用于給結(jié)果集進(jìn)行分區(qū)荆永。它和聚合函數(shù)Group by不同的地方在于它只是將原始數(shù)據(jù)進(jìn)行名次排列废亭,能夠返回一個(gè)分組中的多條記錄(記錄數(shù)不變),而Group by是對原始數(shù)據(jù)進(jìn)行聚合統(tǒng)計(jì)具钥,一般只有一條反映統(tǒng)計(jì)值的結(jié)果(每組返回一條)豆村。

Parttion by 后面如果想按多個(gè)字段分組,則以逗號分隔骂删。

row_number()  over(PARTITION BY col1,col3,col4 ORDER BY col2)

實(shí)例:

(1) 建表造數(shù)據(jù):

create table employee (empid int ,deptid int ,salary decimal(10,2));
insert into employee values(1,10,5500.00);
insert into employee values(2,10,4500.00);
insert into employee values(3,20,1900.00);
insert into employee values(4,20,4800.00);
insert into employee values(5,40,6500.00);
insert into employee values(6,40,14500.00);
insert into employee values(7,40,44500.00);
insert into employee values(8,50,6500.00);
insert into employee values(9,50,7500.00);

數(shù)據(jù)顯示為:


(2) 需求:根據(jù)部門分組掌动,顯示每個(gè)部門的工資等級

sql:

SELECT  *, 
      row_number() over(PARTITION by deptid ORDER BY salary desc)  as score 
 FROM 
      employee

預(yù)期結(jié)果:


二. 真實(shí)案例

通過上面基礎(chǔ)語法和使用,我們也只是簡單地知道row_number()可以用來編號排序使用宁玫,以及分組內(nèi)排序兩種情景粗恢。通過對其有一個(gè)了解之后,你的心中充滿疑問欧瘪, 如果對于在項(xiàng)目中眷射,我們又可以拿它來做什么,又可以解決什么樣的問題。

這個(gè)語法也是我最近工作內(nèi)容的時(shí)候妖碉,才接觸到的涌庭,之前也只是模模糊糊地停留在知道有這個(gè),而在工作中沒實(shí)際用過它欧宜。

上面介紹的是在單表中的一個(gè)操作坐榆,那么對于稍微復(fù)雜的多表關(guān)聯(lián)操作是否有考慮過

下面舉個(gè)貼近身邊的實(shí)例來學(xué)習(xí)一下SQL用法:

左連接表中可能有多條數(shù)據(jù)滿足情況,但只取滿足條件中的第一條冗茸,即取max 自關(guān)聯(lián)的查詢數(shù)據(jù)

select 
      a.*, b.* 
from 
    girl g, 
    (select *, row_number() over(ORDER BY like desc) as rn from boy) b 
where b.rn = 1 and g.like = b.like

上面的意思:girl表和boy表關(guān)聯(lián)席镀,讓girl找到最喜歡的那個(gè)boy;boy表是根據(jù)喜好值排序蚀狰。

這樣就可以用上它了愉昆。

三. 總結(jié)

row_number()的用途非常廣泛,排序最好用它麻蹋,它會(huì)為查詢出來的每一行記錄生成一個(gè)序號跛溉,依次排序且不會(huì)重復(fù),注意使用row_number函數(shù)時(shí)必須要用over子句選擇對某一列進(jìn)行排序才能生成序號扮授。

同時(shí)芳室,在使用排名函數(shù)的時(shí)候需要注意以下三點(diǎn):

  • 1、排名函數(shù)必須有 OVER 子句刹勃。

  • 2堪侯、排名函數(shù)必須有包含 ORDER BY 的 OVER 子句。

  • 3荔仁、分組內(nèi)從1開始排序伍宦。

這個(gè)方法的多數(shù)據(jù)庫兼容性也是很好的,如果你要與數(shù)據(jù)庫打交道乏梁,也請收藏好它次洼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市遇骑,隨后出現(xiàn)的幾起案子卖毁,更是在濱河造成了極大的恐慌,老刑警劉巖落萎,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亥啦,死亡現(xiàn)場離奇詭異,居然都是意外死亡练链,警方通過查閱死者的電腦和手機(jī)翔脱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媒鼓,“玉大人碍侦,你說我怎么就攤上這事粱坤。” “怎么了瓷产?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵站玄,是天一觀的道長。 經(jīng)常有香客問我濒旦,道長株旷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任尔邓,我火速辦了婚禮晾剖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梯嗽。我一直安慰自己齿尽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布灯节。 她就那樣靜靜地躺著循头,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炎疆。 梳的紋絲不亂的頭發(fā)上卡骂,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音形入,去河邊找鬼全跨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛亿遂,可吹牛的內(nèi)容都是我干的浓若。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蛇数,長吁一口氣:“原來是場噩夢啊……” “哼七嫌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起苞慢,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎英妓,沒想到半個(gè)月后挽放,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔓纠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年辑畦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腿倚。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纯出,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情暂筝,我是刑警寧澤箩言,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站焕襟,受9級特大地震影響陨收,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸵赖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一务漩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧它褪,春花似錦饵骨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至包吝,卻和暖如春饼煞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诗越。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工砖瞧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嚷狞。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓块促,卻偏偏與公主長得像,于是被迫代替她去往敵國和親床未。 傳聞我的和親對象是個(gè)殘疾皇子竭翠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容