MySQL語句實現排名


 

首先我們創建一張city_popularity表:

CREATE TABLE city_popularity(
    region int(10) NOT NULL COMMENT '1 國內 2 海外',
    city_name VARCHAR(64) NOT NULL,
    popularity DOUBLE(5,2) NOT NULL);

並向其中添加數據:

INSERT INTO city_popularity (region, city_name, popularity)
VALUES
(1, '北京', 30.0),
(1, '上海', 30.0),
(1, '南京', 10.0),
(2, '倫敦', 20.0),
(1, '張家界', 8.0),
(2, '紐約', 35.0),
(1, '三亞', 25.0),
(2, '新加坡', 35.0);

創建出的表及數據如下:

現在對所有城市的熱門度進行排名:

1. 通過窗口函數

MySQL從8.0開始支持窗口函數,也叫分析函數,序號函數ROW_NUMBER(), RANK(), DENSE_RANK()滿足不同需求的排序

SELECT region, city_name, popularity, 
ROW_NUMBER() OVER (PARTITION BY region ORDER BY popularity DESC) AS rank 
FROM city_popularity;

使用ROW_NUMBER()函數排序結果如下:

SELECT region, city_name, popularity, 
RANK() OVER (PARTITION BY region ORDER BY popularity DESC) AS rank 
FROM city_popularity;

使用RANK()函數排序結果如下:

SELECT region, city_name, popularity, 
DENSE_RANK() OVER (PARTITION BY region ORDER BY popularity DESC) AS rank 
FROM city_popularity;

使用DENSE_RANK()函數排序結果如下:

 

 

2. 通過表的自交

SELECT a.region, a.city_name, a.popularity, (COUNT(b.popularity)+1) AS rank 
FROM city_popularity AS a LEFT JOIN city_popularity AS b 
ON a.region = b.region AND a.popularity<b.popularity
GROUP BY a.region, a.city_name, a.popularity
ORDER BY a.region, rank;

以上通過表的自交實現了對國內和海外城市分別排序,且數據相同的情況,排名保持不變,且占有字符的排序:

 

 3. 通過設置變量

SELECT city_popularity.*,
@rank := @rank+1 AS rank
FROM city_popularity ,(SELECT @rank:=0) init
ORDER BY popularity DESC;

順序排序,每多一條排序自增加一,結果如下:

select city_popularity.*,
case when @popularity = popularity then @rank 
when @popularity := popularity then @rank :=@rank+1 
when @popularity =0 then @rank :=@rank+1 END as rank 
from city_popularity,(select @rank :=0,@popularity :=NULL) init  
ORDER BY popularity DESC;

當數據相同時,排名一致,不相同則排名自增加一,結果如下:

select city_popularity.*,
@rank1 :=@rank1+1,@rank := 
case when @popularity = popularity then @rank 
when @popularity := popularity then @rank1 
when @popularity =0 then @rank1 END as rank
from city_popularity,(select @rank :=0,@popularity :=NULL,@rank1 :=0) init  
ORDER BY popularity DESC;

數據相同的情況,排名保持不變,且占有字符,結果如下:

SELECT region, city_name, popularity, @rank:=@rank+1 AS rank 
FROM city_popularity, (SELECT @rank:=0) q ORDER BY popularity DESC;

 

 

參考鏈接:https://blog.csdn.net/justry_deng/article/details/80597916

                 https://blog.csdn.net/out_of_tune/article/details/90236270


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM