小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

RANK() ,DENSE_RANK ()mysql實(shí)現(xiàn)

 柳7it48xq2tc7q 2019-12-18

作者:風(fēng)澈vio
鏈接:https://www.jianshu.com/p/bb1b72a1623e
來源:簡(jiǎn)書

MySQL中沒有Rank排名函數(shù),當(dāng)我們需要查詢排名時(shí),只能使用MySQL數(shù)據(jù)庫中的基本查詢語句來查詢普通排名。盡管如此,可不要小瞧基礎(chǔ)而簡(jiǎn)單的查詢語句,我們可以利用其來達(dá)到Rank函數(shù)一樣的高級(jí)排名效果。

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

首先我們先創(chuàng)建一個(gè)我們需要進(jìn)行高級(jí)排名查詢的players表,

  1. CREATE TABLE `players` (

  2. `pid` int(2) NOT NULL AUTO_INCREMENT,

  3. `name` varchar(50) NOT NULL,

  4. `age` int(2) NOT NULL,

  5. PRIMARY KEY (`pid`),

  6. UNIQUE KEY `name` (`name`)

  7. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

  8. INSERT INTO `players` (`pid`, `name`, `age`) VALUES

  9. (1, 'Samual', 25),

  10. (2, 'Vino', 20),

  11. (3, 'John', 20),

  12. (4, 'Andy', 22),

  13. (5, 'Brian', 21),

  14. (6, 'Dew', 24),

  15. (7, 'Kris', 25),

  16. (8, 'William', 26),

  17. (9, 'George', 23),

  18. (10, 'Peter', 19),

  19. (11, 'Tom', 20),

  20. (12, 'Andre', 20);

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

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

  1. SELECT pid, name, age, @curRank := @curRank + 1 AS rank

  2. FROM players p, (

  3. SELECT @curRank := 0

  4. ) q

  5. ORDER BY age

  1. | PID | NAME | AGE | RANK |

  2. |-----|---------|-----|------|

  3. | 10 | Peter | 19 | 1 |

  4. | 12 | Andre | 20 | 2 |

  5. | 2 | Vino | 20 | 3 |

  6. | 3 | John | 20 | 4 |

  7. | 11 | Tom | 20 | 5 |

  8. | 5 | Brian | 21 | 6 |

  9. | 4 | Andy | 22 | 7 |

  10. | 9 | George | 23 | 8 |

  11. | 6 | Dew | 24 | 9 |

  12. | 7 | Kris | 25 | 10 |

  13. | 1 | Samual | 25 | 11 |

  14. | 8 | William | 26 | 12 |

要在mysql中聲明一個(gè)變量,你必須在變量名之前使用@符號(hào)。FROM子句中的(@curRank := 0)部分允許我們進(jìn)行變量初始化,而不需要單獨(dú)的SET命令。當(dāng)然,也可以使用SET,但它會(huì)處理兩個(gè)查詢:

  1. SET @curRank := 0;

  2. SELECT pid, name, age, @curRank := @curRank + 1 AS rank

  3. FROM players

  4. ORDER BY age


2、查詢以降序排列

首要按age的降序排列,其次按name進(jìn)行排列,只需修改查詢語句加上ORDER BY和 DESC以及列名即可。

  1. SELECT pid, name, age, @curRank := @curRank + 1 AS rank

  2. FROM players p, (

  3. SELECT @curRank := 0

  4. ) q

  5. ORDER BY age DESC, name


  1. | PID | NAME | AGE | RANK |

  2. |-----|---------|-----|------|

  3. | 8 | William | 26 | 1 |

  4. | 7 | Kris | 25 | 2 |

  5. | 1 | Samual | 25 | 3 |

  6. | 6 | Dew | 24 | 4 |

  7. | 9 | George | 23 | 5 |

  8. | 4 | Andy | 22 | 6 |

  9. | 5 | Brian | 21 | 7 |

  10. | 12 | Andre | 20 | 8 |

  11. | 3 | John | 20 | 9 |

  12. | 11 | Tom | 20 | 10 |

  13. | 2 | Vino | 20 | 11 |

  14. | 10 | Peter | 19 | 12 |


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

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

  1. SELECT pid, name, age,

  2. CASE

  3. WHEN @prevRank = age THEN @curRank

  4. WHEN @prevRank := age THEN @curRank := @curRank + 1

  5. END AS rank

  6. FROM players p,

  7. (SELECT @curRank :=0, @prevRank := NULL) r

  8. ORDER BY age


  1. | PID | NAME | AGE | RANK |

  2. |-----|---------|-----|------|

  3. | 10 | Peter | 19 | 1 |

  4. | 12 | Andre | 20 | 2 |

  5. | 2 | Vino | 20 | 2 |

  6. | 3 | John | 20 | 2 |

  7. | 11 | Tom | 20 | 2 |

  8. | 5 | Brian | 21 | 3 |

  9. | 4 | Andy | 22 | 4 |

  10. | 9 | George | 23 | 5 |

  11. | 6 | Dew | 24 | 6 |

  12. | 7 | Kris | 25 | 7 |

  13. | 1 | Samual | 25 | 7 |

  14. | 8 | William | 26 | 8 |

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

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

當(dāng)使用RANK()函數(shù)時(shí),如果兩個(gè)或以上的行排名并列,則相同的行都會(huì)有相同的排名,但是實(shí)際排名中存在有關(guān)系的差距。

  1. SELECT pid, name, age, rank FROM

  2. (SELECT pid, name, age,

  3. @curRank := IF(@prevRank = age, @curRank, @incRank) AS rank,

  4. @incRank := @incRank + 1,

  5. @prevRank := age

  6. FROM players p, (

  7. SELECT @curRank :=0, @prevRank := NULL, @incRank := 1

  8. ) r

  9. ORDER BY age) s

這是一個(gè)查詢中的子查詢。我們使用三個(gè)變量(@incRank,@prevRank,@curRank)來計(jì)算關(guān)系的情況下,在查詢結(jié)果中我們已經(jīng)補(bǔ)全了因?yàn)椴⒘卸鴮?dǎo)致的排名空位。我們已經(jīng)封閉子查詢到查詢。這個(gè)查詢相當(dāng)于MSSQL和ORACLE中的RANK()函數(shù)。

  1. | PID | NAME | AGE | RANK |

  2. |-----|---------|-----|------|

  3. | 10 | Peter | 19 | 1 |

  4. | 12 | Andre | 20 | 2 |

  5. | 2 | Vino | 20 | 2 |

  6. | 3 | John | 20 | 2 |

  7. | 11 | Tom | 20 | 2 |

  8. | 5 | Brian | 21 | 6 |

  9. | 4 | Andy | 22 | 7 |

  10. | 9 | George | 23 | 8 |

  11. | 6 | Dew | 24 | 9 |

  12. | 7 | Kris | 25 | 10 |

  13. | 1 | Samual | 25 | 10 |

  14. | 8 | William | 26 | 12 |

在這里我們可以看到,Andre,Vino,John和Tom都有相同的age,所以他們排名并列第二。下一個(gè)最高年齡的球員(Brian)排名第6,而不是第3,因?yàn)橛?個(gè)人并列排名在第2。

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

復(fù)制

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多