一文搞懂SQL-mysql实现rank()排序

背景介绍

在使用数据库制作各种统计表的工作中,经常会遇到按分数、人数或者销售额等数值进行排序的需求。某些数据库管理系统已经实现了这样的功能(如Oracle、DB2数据库的RANK函数)。

现在,我们按照价格从高到低的顺序,对下面这张商品进行排序。我们让价格相同的位次也一样,而紧接着他们的商品则有两种排序方法,一种是跳过之后的位次,另一种是不跳过之后的位次。

Products

name price
苹果 50
橘子 100
葡萄 50
西瓜 80
柠檬 30
香蕉 50

窗口函数实现

如果使用窗口函数,可以这样实现。

--排序,使用窗口函数
SELECT name,price
RANK() over (ORDER BY price DESC) AS rank_1,
DENSE_RANK() over (ORDER BY price DESC) AS rank_2
from
Products;

执行结果

name price rank_1 rank_2
橘子 100 1 1
西瓜 80 2 2
苹果 50 3 3
香蕉 50 3 3
葡萄 50 3 3
柠檬 30 6 4

在出现相同的位次后,rank_1跳过之后的位次,rank_2没有跳过,而是连续排序。代码实现起来很简洁,同时也比较容易理解。不过rank函数还是属于标准sql中比较新的功能,目前只有个别数据库实现了它,还不能使用到mysql数据库。

采用等值自链接方法实现

但是我们可以采用不依赖具体数据库实现的方法,下面采用非等值自链接写的代码。也很好的实现了上述功能。

--排序从1开始,如果已经出现相同的位次,则跳过之后的位次
select P1.name,P1.price,
(select count(P2.price)
from Products P2
WHERE P2.price>P1.price)+1 as rank_1
From
Products P1
order by rank_1

执行结果:

name price rank_1
橘子 100 1
西瓜 80 2
苹果 50 3
香蕉 50 3
葡萄 50 3
柠檬 30 6

你可能感兴趣的:(一文教你搞懂SQL,sql,mysql,数据库)