1. 程式人生 > >Leetcode刷題 sql演算法題 178 Rank Scores

Leetcode刷題 sql演算法題 178 Rank Scores

主要參考

--解法一 笛卡爾連線 分組計數 排序
SELECT Scores.Score, COUNT(Ranking.Score) AS RANK
  FROM Scores
     , (
       SELECT DISTINCT Score
         FROM Scores
       ) Ranking
--等於是分組計數 每個分組中方的都是比自己大或相等的所有distinct元素
 WHERE Scores.Score <= Ranking.Score
 --分組
 GROUP BY Scores.Id, Scores.Score 
 --組id排序 降序
 ORDER BY Scores.Score DESC; 
 
--解法二 mysql自定義變數
-- Write your MySQL query statement below
SELECT Score, Rank 
FROM(
  SELECT    Score,
--每一次都每一行都進行判斷和計算
--2 當值為Score,返回0, 否則返回1 也就是不重複的自增 重複的不變
            @curRank := @curRank + IF(@prevScore = Score, 0, 1) AS Rank,
            @prevScore := Score
--1 初始變數值設定為0
  FROM      Scores s, (SELECT @curRank := 0) r, (SELECT @prevScore := NULL) p
--3 降序排列
  ORDER BY  Score DESC
) t;
as Rank就相當於是賦值給Rank,
自定義的變數是不斷的變的,開始的時候那兩個表的值是固定的0和null,
但是排序後開始按照順序一行一行的輸出,
每次輸出as都是根據自定義的變數計算得出值,自定義的變數也不斷更新