mysql分組排名 mysql分組排名

2021-10-17 15:02:02 字數 3917 閱讀 5637

1.建立表並寫入測試資料

create table tb_rank_score

city varchar(20),

score int

insert into tb_rank_score values('sz',89);

insert into tb_rank_score values('sz',76);

insert into tb_rank_score values('sz',50);

insert into tb_rank_score values('sz',89);

insert into tb_rank_score values('sz',78);

insert into tb_rank_score values('sh',90);

insert into tb_rank_score values('sh',34);

insert into tb_rank_score values('sh',78);

insert into tb_rank_score values('sh',67);

insert into tb_rank_score values('sh',76);

2.普通排名:從1開始,順序往下排

mysql> select tb_rank_score.*,@r :=@r + 1 as rank

-> from tb_rank_score,(select @r := 0) r

-> order by score desc;

| city | score | rank |

| sh   |    90 |    1 |

| sz   |    89 |    2 |

| sz   |    89 |    3 |

| sz   |    78 |    4 |

| sh   |    78 |    5 |

| sz   |    76 |    6 |

| sh   |    76 |    7 |

| sh   |    67 |    8 |

| sz   |    50 |    9 |

| sh   |    34 |   10 |

10 rows in set (0.00 sec)

3.並列排名:相同的值是相同的排名

mysql> select tb_rank_score.* ,

-> case

-> when @p=score then @r

-> when @p:=score then @r:=@r+1

-> end rank

-> from tb_rank_score,(select @r:=0,@p:=null)r

-> order by score desc;

| city | score | rank |

| sh   |    90 |    1 |

| sz   |    89 |    2 |

| sz   |    89 |    2 |

| sz   |    78 |    3 |

| sh   |    78 |    3 |

| sz   |    76 |    4 |

| sh   |    76 |    4 |

| sh   |    67 |    5 |

| sz   |    50 |    6 |

| sh   |    34 |    7 |

10 rows in set (0.00 sec)

4.分組後組內排名

mysql> select city,score,rank

-> from

-> select tb_rank_score.*,if(@p=city,@r:=@r+1,@r:=1) as rank,

-> @p:=city

-> from tb_rank_score,(select @p:=null,@r:=0)r

-> order by city,score desc

-> )s;

| city | score | rank |

| sh   |    90 |    1 |

| sh   |    78 |    2 |

| sh   |    76 |    3 |

| sh   |    67 |    4 |

| sh   |    34 |    5 |

| sz   |    89 |    1 |

| sz   |    89 |    2 |

| sz   |    78 |    3 |

| sz   |    76 |    4 |

| sz   |    50 |    5 |

10 rows in set (0.00 sec)

5.分組後並列排名:組內相同數值排名相同

mysql> select city,score,rank

-> from

-> select *,

-> if(@p=city,

->     case

->        when @s=score then @r

->        when @s:=score then @r:=@r+1

->     end,

->    @r:=1 ) as rank,

-> @p:=city,

-> @s:=score

-> from tb_rank_score,(select @p:=null,@s:=null,@r:=0)r

-> order by city,score desc

-> )s;

| city | score | rank |

| sh   |    90 |    1 |

| sh   |    78 |    2 |

| sh   |    76 |    3 |

| sh   |    67 |    4 |

| sh   |    34 |    5 |

| sz   |    89 |    1 |

| sz   |    89 |    1 |

| sz   |    78 |    2 |

| sz   |    76 |    3 |

| sz   |    50 |    4 |

10 rows in set (0.00 sec)

6.分組後取各組的前三名

mysql> select city,score,rank

-> from

-> select *,

-> if(@p=city,

->     case

->         when @s=score then @r

->         when @s:=score then @r:=@r+1

->     end,

->   @r:=1 ) as rank,

-> @p:=city,

-> @s:=score

-> from tb_rank_score,(select @p:=null,@s:=null,@r:=0)r

-> order by city,score desc

-> )s

-> where rank <4;

| city | score | rank |

| sh   |    90 |    1 |

| sh   |    78 |    2 |

| sh   |    76 |    3 |

| sz   |    89 |    1 |

| sz   |    89 |    1 |

| sz   |    78 |    2 |

| sz   |    76 |    3 |

7 rows in set (0.00 sec)

mysql 控制分組個數 MYSQL 按限制分組

有沒有一種簡單的方法可以將group by結果限制在前2位。以下查詢返回所有結果。使用 limit 2 將整個列表減少到僅前2個條目。select distinct rating name id markets,sum rating good good sum rating neutral neut...

mysql 隨機分組 Mysql 分組選擇

mysql 分組選擇與group concat 在其他的資料庫中我們遇到分組選擇的問題時,比如在分組中計算前10名的平均分 我們可以使用row number over 比較方便的得到。但是在mysql中,問題就被拋了出來,因為mysql並沒有乙個rownum內建資料元組訪問方式。在這裡我提供三種方式...

mysql 排名 MySQL用變數實現排名

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