首先我們建立一張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使用row_number()函式排序結果如下:region, city_name, popularity,
row_number()
over (partition by region order
by popularity desc) as
rank
from city_popularity;
使用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...