MySQL中row_number() over排序函數(shù)功能實現(xiàn)

由于row_number() over 是Oracle中的函數(shù)辣苏,MySQL如何實現(xiàn)相同功能包归?

示例:想要取出每個課程前3名的學(xué)生信息传蹈、課程id距境,成績與對應(yīng)課程內(nèi)排名

創(chuàng)建student表:
s_id為學(xué)生id,s_name為學(xué)生姓名祭阀,s_sex為性別
創(chuàng)建score表:
s_id 為學(xué)生id鹉戚,c_id為課程id,s_score為對應(yīng)的成績

create table student (s_id int,
                      s_name varchar(45),
                      s_sex varchar(25));
insert into student values
(01,'趙一','男'),
(02,'錢二','男'),
(03,'孫三','男'),
(04,'李四','男'),
(05,'周五','女'),
(06,'吳六','女'),
(07,'鄭七','女'),
(08,'王八','女');

create table score (s_id int,
                    c_id int,
                    s_score int);                   
insert into score values
(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)专控;
student

score
#內(nèi)嵌部分:
set @rank:=0;
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;

注意:@current_id=c_id抹凳,當(dāng)c_id不是當(dāng)前的課程時,rank重新從1開始計數(shù)伦腐,否則在當(dāng)前rank上加1赢底,@current_id賦值次序不能錯,第一個正好未賦值柏蘑,case when @current_id<>c_id 成立then 1執(zhí)行
此時的排序需要現(xiàn)基于課程id幸冻,再基于成績逆序

內(nèi)嵌部分執(zhí)行結(jié)果

錯誤示范:

#將 @current_id:=c_id提到前面,此時不能得到想要的結(jié)果咳焚,因為經(jīng)過賦值 @current_id:=c_id始終成立
set @rank:=0;
select *, @current_id:=c_id,  @rank:=case when @current_id<>c_id then 1 else @rank+1 
                                     end as rank
from score 
order by c_id, s_score desc;
錯誤示范
#整體連起來寫:
set @rank:=0;
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
order by c_id, rank
整體最終執(zhí)行結(jié)果

注意:在最后的條件設(shè)定中需要用having不能用where,因為在原表中是不存在rank字段的革半,這是我們?yōu)榱巳?shù)所構(gòu)造的

參考學(xué)習(xí):http://www.reibang.com/p/3b6f687809e5
感謝作者分享碑定!
————————————————————————————————————————
方法2:

#步驟1:計數(shù)形成rnk列
create table x as
select a.s_id, a.c_id, a.s_score,
       (select count(*) from score b where a.c_id=b.c_id and a.s_score<b.s_score) as rnk
from score a
order by a.c_id,(select count(*) from score b where a.c_id=b.c_id and a.s_score<b.s_score)
#步驟2:連接兩表,取前三
select x.s_id, y.s_name, x.c_id, x.s_score, rnk+1 as rnk
from x
left join student y
on x.s_id = y.s_id
where rnk=0 or rnk=1 or rnk=2
order by x.c_id, rnk
步驟一執(zhí)行結(jié)果
最終結(jié)果

此方法在實際應(yīng)用于抽取成績前3名時,如果有成績并列的情況不會將某些學(xué)生落下
具體哪一種方法可視應(yīng)用場景而定

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市普泡,隨后出現(xiàn)的幾起案子劫哼,更是在濱河造成了極大的恐慌权烧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伤溉,死亡現(xiàn)場離奇詭異般码,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)乱顾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門板祝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人走净,你說我怎么就攤上這事券时」吕铮” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵橘洞,是天一觀的道長捌袜。 經(jīng)常有香客問我,道長炸枣,這世上最難降的妖魔是什么虏等? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮适肠,結(jié)果婚禮上霍衫,老公的妹妹穿的比我還像新娘。我一直安慰自己侯养,他們只是感情好敦跌,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沸毁,像睡著了一般峰髓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上息尺,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天携兵,我揣著相機(jī)與錄音,去河邊找鬼搂誉。 笑死徐紧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炭懊。 我是一名探鬼主播并级,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侮腹!你這毒婦竟也來了嘲碧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤父阻,失蹤者是張志新(化名)和其女友劉穎愈涩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體加矛,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡履婉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了斟览。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毁腿。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出已烤,到底是詐尸還是另有隱情鸠窗,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布胯究,位于F島的核電站塌鸯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏唐片。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一涨颜、第九天 我趴在偏房一處隱蔽的房頂上張望费韭。 院中可真熱鬧,春花似錦庭瑰、人聲如沸星持。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽督暂。三九已至,卻和暖如春穷吮,著一層夾襖步出監(jiān)牢的瞬間逻翁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工捡鱼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留八回,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓驾诈,卻偏偏與公主長得像缠诅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子乍迄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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

  • Student(S#,Sname,Sage,Ssex) 學(xué)生表 Course(C#,Cname,T#) 課程表 S...
    忘了呼吸的那只貓閱讀 2,841評論 0 8
  • 有時候我們想要獲取每組的前n個記錄管引,由于mysql中沒有row_number() over 函數(shù),之前部門大佬寫了...
    Taodede閱讀 13,195評論 0 1
  • 說明:以下五十個語句都按照測試數(shù)據(jù)進(jìn)行過測試闯两,最好每次只單獨(dú)運(yùn)行一個語句褥伴。 問題及描述: --1.學(xué)生表 Stud...
    lijun_m閱讀 1,288評論 0 1
  • 1. MYSQL安裝 安裝教程:沒有data目錄和my-default.ini和my.ini文件以及服務(wù)無法啟動的...
    262153閱讀 526評論 0 1
  • 當(dāng)然算得上是相識一場 但仍舊蒸發(fā)于烈日頹唐 楊溢民《所以愛午夜》 ——短句番三
    FTHEG閱讀 116評論 0 1