mysql中类似rownumber函数_在MySql中实现类似row_number,dense_rank,rank函数的排序方法...

MySQL中没有Rank排名函数,当需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名。要在mysql中声明一个变量,必须在变量名之前使用@符号。FROM子句中的(@curRank := 0)部分允许我们进行变量初始化,而不需要单独的SET命令。当然,也可以使用SET

CREATE TABLE `players` (

`pid` int(2) NOT NULL AUTO_INCREMENT,

`name` varchar(50) NOT NULL,

`age` int(2) NOT NULL,

PRIMARY KEY (`pid`),

UNIQUE KEY `name` (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `players` (`pid`, `name`, `age`) VALUES

(1, 'Samual', 25),

(2, 'Vino', 20),

(3, 'John', 20),

(4, 'Andy', 22),

(5, 'Brian', 21),

(6, 'Dew', 24),

(7, 'Kris', 25),

(8, 'William', 26),

(9, 'George', 23),

(10, 'Peter', 19),

(11, 'Tom', 20),

(12, 'Andre', 20);

1、实现Rank普通排名函数,即row_number():

SELECT pid, name, age, @curRank := @curRank + 1 AS rank

FROM players p, (

SELECT @curRank := 0

) q

ORDER BY age

SET @curRank := 0;

SELECT pid, name, age, @curRank := @curRank + 1 AS rank

FROM players

ORDER BY age

PID

NAME

AGE

RANK

10

Peter

19

1

12

Andre

20

2

2

Vino

20

3

3

John

20

4

11

Tom

20

5

5

Brian

21

6

4

Andy

22

7

9

George

23

8

6

Dew

24

9

7

Kris

25

10

1

Samual

25

11

8

William

26

12

2、实现Rank普通并列排名函数,即dense_rank():

SELECT pid, name, age,

CASE

WHEN @prevRank = age THEN @curRank

WHEN @prevRank := age THEN @curRank := @curRank + 1

END AS rank

FROM players p,

(SELECT @curRank :=0, @prevRank := NULL) r

ORDER BY age

PID

NAME

AGE

RANK

10

Peter

19

1

12

Andre

20

2

2

Vino

20

2

3

John

20

2

11

Tom

20

2

5

Brian

21

3

4

Andy

22

4

9

George

23

5

6

Dew

24

6

7

Kris

25

7

1

Samual

25

7

8

William

26

8

3,实现Rank高级并列排名函数,即rank()函数:

SELECT pid, name, age, rank

FROM

(SELECT pid, name, age,

@curRank := IF(@prevRank = age, @curRank, @incRank) AS rank,

@incRank := @incRank + 1,

@prevRank := age

FROM players p, (

SELECT @curRank :=0, @prevRank := NULL, @incRank := 1

) r

ORDER BY age

) s

PID

NAME

AGE

RANK

10

Peter

19

1

12

Andre

20

2

2

Vino

20

2

3

John

20

2

11

Tom

20

2

5

Brian

21

6

4

Andy

22

7

9

George

23

8

6

Dew

24

9

7

Kris

25

10

1

Samual

25

10

8

William

26

12

来源简书:https://www.jianshu.com/p/bb1b72a1623e

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL,没有内置的ROW_NUMBER()和RANK()函数。引用和的代码示例并不适用于MySQL数据库。在MySQL,可以使用变量来模拟ROW_NUMBER()函数。下面是一个示例: SELECT *, @row_number := CASE WHEN @user_id = user_id THEN @row_number + 1 ELSE 1 END AS row_number, @user_id := user_id FROM order_content ORDER BY user_id, order_price; 这段代码将为每个用户计算一个row_number,并按照user_id和order_price进行排序。注意,在执行此查询之前,需要先初始化变量@row_number和@user_id。 至于RANK()和DENSE_RANK()函数,在MySQL也没有直接的内置函数。但是,可以使用子查询和变量来实现。下面是一个示例: SELECT * FROM ( SELECT *, @rank := IF(@prev_user_id = user_id, @rank + 1, 1) AS rank, @dense_rank := IF(@prev_user_id = user_id, @dense_rank + 1, @dense_rank + 1) AS dense_rank, @prev_user_id := user_id FROM order_content ORDER BY user_id, order_price DESC ) AS a WHERE a.rank = 1; 这段代码将计算每个用户的rankdense_rank,并按照user_id和order_price进行排序。注意,在执行此查询之前,需要先初始化变量@rank、@dense_rank和@prev_user_id。 因此,在MySQL,我们可以使用变量来模拟ROW_NUMBER()、RANK()和DENSE_RANK()函数的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [[Mysql] RANK()函数 | ROW_NUMBER()函数 | DENSE_RANK()函数](https://blog.csdn.net/Hudas/article/details/124584662)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值