MySQL語句實現排名

2022-09-01 11:45:09 字數 3901 閱讀 1431

首先我們建立一張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()函式排序結果如下:

使用rank()函式排序結果如下:

使用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

bya.region, a.city_name, a.popularity

order

by a.region, rank;

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

3. 通過設定變數

select city_popularity.*

,@rank :=

@rank+1

asrank

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

endas

rank

from city_popularity,(select

@rank :=

0,@popularity :=

null

) init

order

by popularity desc;

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

資料相同的情況,排名保持不變,且占有字元,結果如下:

mysql實現排名

心血來潮刷了一波leetcode,遇見個有意思的sql題目。題目連線 編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名 rank 相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有 間隔 id score 1 3.50 2 3.65 3 4.0...

mysql 排名 MySQL用變數實現排名

mysql 8.0版本用視窗函式就可以實現排名,有三種方式,對相同值的處理不同 以上區別會在文末舉例,本文主要討論用變數實現排名 5.5版本用不了視窗函式 至少排序視窗用不了,其他的沒試過 那麼對於要顯示排名的需求就得想其他辦法啦,看網上的資料可以用變數來實現,來看看 首先建表並插入資料 資料資料來...

mysql 排名函式 MySQL排名函式實現

資料庫準備 建立乙個分數表s score create table s score id int not null auto increment,score int not null default 0,name varchar 20 character set utf8mb4 null,prima...