mysql中row_number() over功能實(shí)現(xiàn)

有時(shí)候我們想要獲取每組的前n個(gè)記錄钟些,由于mysql中沒有row_number() over 函數(shù),之前部門大佬寫了這個(gè)方法,覺得很實(shí)用,這里展示給大家尊残。
student表:
s_id為學(xué)生id,s_name為學(xué)生姓名淤堵,s_birth為出生年月,s_sex為性別
score表:
s_id 為學(xué)生id顷扩,c_id為課程id拐邪,s_score為對(duì)應(yīng)的成績(jī)。

mysql> select * from student;
+------+--------+------------+-------+
| s_id | s_name | s_birth    | s_sex |
+------+--------+------------+-------+
| 01   | 趙雷   | 1990-01-01 | 男    |
| 02   | 錢電   | 1990-12-21 | 男    |
| 03   | 孫風(fēng)   | 1990-05-20 | 男    |
| 04   | 李云   | 1990-08-06 | 男    |
| 05   | 周梅   | 1991-12-01 | 女    |
| 06   | 吳蘭   | 1992-03-01 | 女    |
| 07   | 鄭竹   | 1989-07-01 | 女    |
| 08   | 王菊   | NULL       | 女    |
+------+--------+------------+-------+
8 rows in set (0.00 sec)
mysql> select * from score;
+------+------+---------+
| s_id | c_id | s_score |
+------+------+---------+
| 01   | 01   |      80 |
| 01   | 02   |      90 |
| 01   | 03   |      99 |
| 02   | 01   |      70 |
| 02   | 02   |      60 |
| 02   | 03   |      80 |
| 03   | 01   |      80 |
| 03   | 02   |      80 |
| 03   | 03   |      80 |
| 04   | 01   |      50 |
| 04   | 02   |      30 |
| 04   | 03   |      20 |
| 05   | 01   |      76 |
| 05   | 02   |      87 |
| 06   | 01   |      31 |
| 06   | 03   |      34 |
| 07   | 02   |      89 |
| 07   | 03   |      98 |
+------+------+---------+
18 rows in set (0.00 sec)

現(xiàn)想要取出每個(gè)課程前3名的學(xué)生信息隘截、課程id扎阶,成績(jī)與對(duì)應(yīng)課程內(nèi)排名,如下所示:
+------+--------+------------+-------+------+---------+------+
| s_id | s_name | s_birth | s_sex | c_id | s_score | rank |
+------+--------+------------+-------+------+---------+------+
| 01 | 趙雷 | 1990-01-01 | 男 | 01 | 80 | 1 |
| 03 | 孫風(fēng) | 1990-05-20 | 男 | 01 | 80 | 2 |
| 05 | 周梅 | 1991-12-01 | 女 | 01 | 76 | 3 |
| 01 | 趙雷 | 1990-01-01 | 男 | 02 | 90 | 1 |
| 07 | 鄭竹 | 1989-07-01 | 女 | 02 | 89 | 2 |
| 05 | 周梅 | 1991-12-01 | 女 | 02 | 87 | 3 |
| 01 | 趙雷 | 1990-01-01 | 男 | 03 | 99 | 1 |
| 07 | 鄭竹 | 1989-07-01 | 女 | 03 | 98 | 2 |
| 02 | 錢電 | 1990-12-21 | 男 | 03 | 80 | 3 |
+------+--------+------------+-------+------+---------+------+

查詢實(shí)現(xiàn)如下:

mysql> set @rank:=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select a.*,b.c_id,b.s_score,b.rank from(
    -> select *,@rank:=case when @current_id<>c_id then 1 else @rank+1 end as rank,@current_id:=c_id from score order by c_id,s_score desc)b
    -> left join student a on a.s_id=b.s_id
    -> having rank<=3;

首先看表b的部分,令@current_id=c_id婶芭,當(dāng)c_id不是當(dāng)前的課程時(shí)东臀,rank重新從1開始計(jì)數(shù),某則在在當(dāng)前rank上加1犀农。
需要注意的是惰赋,此時(shí)的排序需要現(xiàn)基于課程id,再基于成績(jī)逆序。

mysql> select *,@rank:=case when @current_id<>c_id then 1 else @rank+1 end as rank,
    -> @current_id:=c_id from score order by c_id,s_score desc;
+------+------+---------+------+-------------------+
| s_id | c_id | s_score | rank | @current_id:=c_id |
+------+------+---------+------+-------------------+
| 01   | 01   |      80 |    1 | 01                |
| 03   | 01   |      80 |    2 | 01                |
| 05   | 01   |      76 |    3 | 01                |
| 02   | 01   |      70 |    4 | 01                |
| 04   | 01   |      50 |    5 | 01                |
| 06   | 01   |      31 |    6 | 01                |
| 01   | 02   |      90 |    1 | 02                |
| 07   | 02   |      89 |    2 | 02                |
| 05   | 02   |      87 |    3 | 02                |
| 03   | 02   |      80 |    4 | 02                |
| 02   | 02   |      60 |    5 | 02                |
| 04   | 02   |      30 |    6 | 02                |
| 01   | 03   |      99 |    1 | 03                |
| 07   | 03   |      98 |    2 | 03                |
| 02   | 03   |      80 |    3 | 03                |
| 03   | 03   |      80 |    4 | 03                |
| 06   | 03   |      34 |    5 | 03                |
| 04   | 03   |      20 |    6 | 03                |
+------+------+---------+------+-------------------+
18 rows in set (0.00 sec)

在此基礎(chǔ)上基于s_id連接student表即可赁濒,另外在最后的條件設(shè)定中需要用having不能用where轨奄,因?yàn)樵谠碇惺遣淮嬖趓ank字段的,這是我們?yōu)榱巳?shù)所構(gòu)造的拒炎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挪拟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子击你,更是在濱河造成了極大的恐慌玉组,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丁侄,死亡現(xiàn)場(chǎng)離奇詭異惯雳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绒障,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門吨凑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人户辱,你說我怎么就攤上這事鸵钝。” “怎么了庐镐?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵恩商,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我必逆,道長(zhǎng)怠堪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任名眉,我火速辦了婚禮粟矿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘损拢。我一直安慰自己陌粹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布福压。 她就那樣靜靜地躺著掏秩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荆姆。 梳的紋絲不亂的頭發(fā)上蒙幻,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音胆筒,去河邊找鬼邮破。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的决乎。 我是一名探鬼主播队询,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼构诚!你這毒婦竟也來了蚌斩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤范嘱,失蹤者是張志新(化名)和其女友劉穎送膳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丑蛤,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叠聋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了受裹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碌补。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖棉饶,靈堂內(nèi)的尸體忽然破棺而出厦章,到底是詐尸還是另有隱情,我是刑警寧澤照藻,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布袜啃,位于F島的核電站,受9級(jí)特大地震影響幸缕,放射性物質(zhì)發(fā)生泄漏群发。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一发乔、第九天 我趴在偏房一處隱蔽的房頂上張望熟妓。 院中可真熱鬧,春花似錦栏尚、人聲如沸起愈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坤次,卻和暖如春古劲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缰猴。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工产艾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓闷堡,卻偏偏與公主長(zhǎng)得像隘膘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杠览,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • 說明:以下五十個(gè)語句都按照測(cè)試數(shù)據(jù)進(jìn)行過測(cè)試弯菊,最好每次只單獨(dú)運(yùn)行一個(gè)語句。 問題及描述: --1.學(xué)生表 Stud...
    lijun_m閱讀 1,304評(píng)論 0 1
  • 測(cè)試表 --建表--學(xué)生表CREATETABLE`Student`(`s_id`VARCHAR(20),`s_na...
    白雪歌送武判官歸天閱讀 399評(píng)論 5 0
  • 來簡(jiǎn)書也有半年時(shí)間了,只是發(fā)過幾篇碎碎念软舌,今天閑來無事才漆,再來發(fā)一篇吧。 我看好多人都喜歡把在簡(jiǎn)書寫的文章發(fā)在朋友圈...
    李功名閱讀 605評(píng)論 0 0
  • 晚上佛点,一同事的親姐也是我們班一個(gè)家長(zhǎng)請(qǐng)吃飯醇滥。席間,班主任提到該學(xué)生有早戀苗頭超营,請(qǐng)家長(zhǎng)多留心鸳玩,正確引導(dǎo)...
    佛說隨喜閱讀 355評(píng)論 2 5
  • 就像日本電影<墊底辣妹>主人公一樣怀喉,一個(gè)人奮斗的初期是不會(huì)有多少人理解的。以前的我是和一群小伙伴瘋打鬧的我船响,是去K...
    白可r閱讀 322評(píng)論 0 0