在MySQL中實現(xiàn)Rank高級排名函數(shù)

MySQL中沒有Rank排名函數(shù)游盲,當我們需要查詢排名時,只能使用MySQL數(shù)據(jù)庫中的基本查詢語句來查詢普通排名蛮粮。盡管如此益缎,可不要小瞧基礎而簡單的查詢語句,我們可以利用其來達到Rank函數(shù)一樣的高級排名效果然想。

在這里我用一個簡單例子來實現(xiàn)排名的查詢:

首先我們先創(chuàng)建一個我們需要進行高級排名查詢的players表莺奔,

CREATE TABLE `players` (
  `pid` int(2) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `age` int(2) NOT NULL,
  PRIMARY KEY (`pid`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

INSERT INTO `players` (`pid`, `name`, `age`) VALUES
(1, 'Samual', 25),
(2, 'Vino', 20),
(3, 'John', 20),
(4, 'Andy', 22),
(5, 'Brian', 21),
(6, 'Dew', 24),
(7, 'Kris', 25),
(8, 'William', 26),
(9, 'George', 23),
(10, 'Peter', 19),
(11, 'Tom', 20),
(12, 'Andre', 20);

1、在MySQL中實現(xiàn)Rank普通排名函數(shù)

在這里变泄,我們希望獲得一個排名字段的列令哟,以及age的升序排列。所以我們的查詢語句將是:

SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players p, (
SELECT @curRank := 0
) q
ORDER BY age
| PID |    NAME | AGE | RANK |
|-----|---------|-----|------|
|  10 |   Peter |  19 |    1 |
|  12 |   Andre |  20 |    2 |
|   2 |    Vino |  20 |    3 |
|   3 |    John |  20 |    4 |
|  11 |     Tom |  20 |    5 |
|   5 |   Brian |  21 |    6 |
|   4 |    Andy |  22 |    7 |
|   9 |  George |  23 |    8 |
|   6 |     Dew |  24 |    9 |
|   7 |    Kris |  25 |   10 |
|   1 |  Samual |  25 |   11 |
|   8 | William |  26 |   12 |

要在mysql中聲明一個變量杖刷,你必須在變量名之前使用@符號励饵。FROM子句中的(@curRank := 0)部分允許我們進行變量初始化,而不需要單獨的SET命令滑燃。當然役听,也可以使用SET,但它會處理兩個查詢:

SET @curRank := 0;
SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players
ORDER BY age

2表窘、查詢以降序排列

首要按age的降序排列典予,其次按name進行排列,只需修改查詢語句加上ORDER BYDESC以及列名即可乐严。

SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players p, (
SELECT @curRank := 0
) q
ORDER BY age DESC, name
| PID |    NAME | AGE | RANK |
|-----|---------|-----|------|
|   8 | William |  26 |    1 |
|   7 |    Kris |  25 |    2 |
|   1 |  Samual |  25 |    3 |
|   6 |     Dew |  24 |    4 |
|   9 |  George |  23 |    5 |
|   4 |    Andy |  22 |    6 |
|   5 |   Brian |  21 |    7 |
|  12 |   Andre |  20 |    8 |
|   3 |    John |  20 |    9 |
|  11 |     Tom |  20 |   10 |
|   2 |    Vino |  20 |   11 |
|  10 |   Peter |  19 |   12 |

3瘤袖、在MySQL中實現(xiàn)Rank普通并列排名函數(shù)

現(xiàn)在,如果我們希望為并列數(shù)據(jù)的行賦予相同的排名昂验,則意味著那些在排名比較列中具有相同值的行應在MySQL中計算排名時保持相同的排名(例如在我們的例子中的age)捂敌。為此,我們使用了一個額外的變量既琴。

SELECT pid, name, age, 
CASE 
WHEN @prevRank = age THEN @curRank 
WHEN @prevRank := age THEN @curRank := @curRank + 1
END AS rank
FROM players p, 
(SELECT @curRank :=0, @prevRank := NULL) r
ORDER BY age
| PID |    NAME | AGE | RANK |
|-----|---------|-----|------|
|  10 |   Peter |  19 |    1 |
|  12 |   Andre |  20 |    2 |
|   2 |    Vino |  20 |    2 |
|   3 |    John |  20 |    2 |
|  11 |     Tom |  20 |    2 |
|   5 |   Brian |  21 |    3 |
|   4 |    Andy |  22 |    4 |
|   9 |  George |  23 |    5 |
|   6 |     Dew |  24 |    6 |
|   7 |    Kris |  25 |    7 |
|   1 |  Samual |  25 |    7 |
|   8 | William |  26 |    8 |

如上所示占婉,具有相同數(shù)據(jù)和排行的兩行或多行,它們都會獲得相同的排名甫恩。玩家Andre, Vino, John 和Tom都有相同的age逆济,所以他們排名并列第二。下一個最高age的玩家(Brian)排名第3。這個查詢相當于MSSQL和ORACLE 中的DENSE_RANK()函數(shù)奖慌。


4抛虫、在MySQL中實現(xiàn)Rank高級并列排名函數(shù)

當使用RANK()函數(shù)時,如果兩個或以上的行排名并列简僧,則相同的行都會有相同的排名建椰,但是實際排名中存在有關系的差距。

SELECT pid, name, age, rank FROM
(SELECT pid, name, age,
@curRank := IF(@prevRank = age, @curRank, @incRank) AS rank, 
@incRank := @incRank + 1, 
@prevRank := age
FROM players p, (
SELECT @curRank :=0, @prevRank := NULL, @incRank := 1
) r 
ORDER BY age) s

這是一個查詢中的子查詢涎劈。我們使用三個變量(@incRank广凸,@prevRank阅茶,@curRank)來計算關系的情況下蛛枚,在查詢結果中我們已經補全了因為并列而導致的排名空位。我們已經封閉子查詢到查詢脸哀。這個查詢相當于MSSQL和ORACLE中的RANK()函數(shù)蹦浦。

| PID |    NAME | AGE | RANK |
|-----|---------|-----|------|
|  10 |   Peter |  19 |    1 |
|  12 |   Andre |  20 |    2 |
|   2 |    Vino |  20 |    2 |
|   3 |    John |  20 |    2 |
|  11 |     Tom |  20 |    2 |
|   5 |   Brian |  21 |    6 |
|   4 |    Andy |  22 |    7 |
|   9 |  George |  23 |    8 |
|   6 |     Dew |  24 |    9 |
|   7 |    Kris |  25 |   10 |
|   1 |  Samual |  25 |   10 |
|   8 | William |  26 |   12 |

在這里我們可以看到,Andre撞蜂,Vino盲镶,John和Tom都有相同的age,所以他們排名并列第二蝌诡。下一個最高年齡的球員(Brian)排名第6溉贿,而不是第3,因為有4個人并列排名在第2浦旱。

好的宇色,我希望在這些例子后,能讓你了解RANK()和DENSE_RANK()之間的區(qū)別颁湖,并且知道在哪里應使用哪個查詢來獲取MySQL中的rank函數(shù)宣蠕。謝謝。

via http://fellowtuts.com/mysql/query-to-obtain-rank-function-in-mysql

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末甥捺,一起剝皮案震驚了整個濱河市抢蚀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镰禾,老刑警劉巖皿曲,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吴侦,居然都是意外死亡屋休,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門妈倔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來博投,“玉大人,你說我怎么就攤上這事盯蝴∫慊” “怎么了听怕?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長虑绵。 經常有香客問我尿瞭,道長,這世上最難降的妖魔是什么翅睛? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任声搁,我火速辦了婚禮,結果婚禮上捕发,老公的妹妹穿的比我還像新娘疏旨。我一直安慰自己,他們只是感情好扎酷,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布檐涝。 她就那樣靜靜地躺著,像睡著了一般法挨。 火紅的嫁衣襯著肌膚如雪谁榜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天凡纳,我揣著相機與錄音窃植,去河邊找鬼。 笑死荐糜,一個胖子當著我的面吹牛巷怜,可吹牛的內容都是我干的。 我是一名探鬼主播狞尔,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丛版,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了偏序?” 一聲冷哼從身側響起页畦,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎研儒,沒想到半個月后豫缨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡端朵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年好芭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冲呢。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡舍败,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情邻薯,我是刑警寧澤裙戏,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站厕诡,受9級特大地震影響累榜,放射性物質發(fā)生泄漏。R本人自食惡果不足惜灵嫌,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一壹罚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寿羞,春花似錦猖凛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至霞幅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間量瓜,已是汗流浹背司恳。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绍傲,地道東北人扔傅。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像烫饼,于是被迫代替她去往敵國和親猎塞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容

  • 分析函數(shù)杠纵,也稱為窗口函數(shù)荠耽,通常被認為僅對數(shù)據(jù)倉庫SQL有用。使用分析函數(shù)的查詢比藻,基于對數(shù)據(jù)行的分組來計算總量值铝量。與...
    貓貓_tomluo閱讀 3,323評論 3 18
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法银亲,內部類的語法慢叨,繼承相關的語法,異常的語法务蝠,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • 2017.7.18第48天 星期二 晴 今天是兒子學英語拍谐,暑假班的最后一課,老師讓家長們去看一下孩子們學...
    鑫隆媽媽閱讀 222評論 0 1
  • 文/若杉 1气嫁、 不知道大家身邊是不是都有這樣的朋友: 你有需求他必定會盡心盡力的幫你当窗; 一起逛街吃飯旅行,他也一定...
    若杉閱讀 1,331評論 34 36
  • 微信小程序1月9日正式上線寸宵,估計這幾天都是這個玩意刷屏了崖面。自媒體,直播推出的時候都沒有這么大的影響力梯影,但是依然...
    鄉(xiāng)本閱讀 12,089評論 0 0