天天看點

MySQL之分數排名的兩種方式及解法

問題1 編寫一個 SQL 查詢來實作分數排名。如果兩個分數相同,則兩個分數排名(Rank)相同。請注意,平分後的下一個名次應該是下一個連續的整數值。換句話說,名次之間不應該有“間隔”。

先建立資料表

MySQL之分數排名的兩種方式及解法

問題思路:

1、可以采取表連接配接的方法,左表與右表比較,若左表資料小于右表資料,對右表計數

2、再按照Id分組

3、倒序排列

語句如下:

#思路:連結清單;左表的分數小于右表的時候,對右表計數,按照ID分組,倒序排列
SELECT s.Score,COUNT(DISTINCT s.score) AS rank
	FROM scores a JOIN scores s ON a.score<=s.score
	GROUP BY a.id ORDER BY a.score DESC;

           

結果為

MySQL之分數排名的兩種方式及解法

問題2 :排名不連續

結果為

MySQL之分數排名的兩種方式及解法

完整代碼為

CREATE TABLE IF NOT EXISTS Scores(
Id INT PRIMARY KEY,
Score FLOAT NOT NULL
)Engine=Innodb;

INSERT INTO Scores VALUES(1,3.50);
INSERT INTO Scores VALUES(2,3.65);
INSERT INTO Scores VALUES(3,4.00);
INSERT INTO Scores VALUES(4,3.85);
INSERT INTO Scores VALUES(5,4.00);
INSERT INTO Scores VALUES(6,3.65);

#第一種問題方式:排名連續
#解決問題
#思路:連結清單;左表的分數小于右表的時候,對右表計數,按照ID分組,倒序排列
SELECT t.score,(SELECT COUNT(s.score)+1 
FROM (SELECT s.score,COUNT(s.score) 
FROM scores s 
GROUP BY score 
ORDER BY score DESC) s WHERE s.score>t.score) rank 
FROM scores t ORDER BY t.score DESC;

#第二種問題方式:排名不連續
SELECT t.score,(SELECT COUNT(s.score)+1 
FROM scores s 
WHERE s.score>t.score) rank 
FROM scores t 
ORDER BY t.score DESC;

           

繼續閱讀