LeetCode SQL 178 分数排名

在这里插入图片描述

使用函数

Scores表中没有rank属性,其实这里用到一个函数rank() over()
此函数会自动的赋给每行一个排名,用在select里面

Select
    s.score,
    RANK() OVER(
        Order By s.score Desc)'rank'  //有的版本要求自定义名rank需要引号,有的不需要
    From
        Scores s

测试数据
在这里插入图片描述
运行结果:

scorerank
4.001
4.001
3.853--------->2
3.654--------->3
3.654--------->3
3.506--------->4

可以看出rank一列,我们需进一步优化保证下一个名次无间隔:1接下来是2,而不是3
怎么实现?

使用另外一个函数dense_rank() over()

Select
    s.score,
    dense_rank() over(Order By s.score desc)as 'rank'  #这个rank之所以要加引号,因为rank本身是个函数,直接写rank会报错
From Scores s;
scorerank
4.001
4.001
3.852
3.653
3.653
3.504

在这里插入图片描述

自定义实现

除了使用函数之外
可以看出rank一列,我们需进一步优化保证下一个名次无间隔:1接下来是2,而不是3
怎么实现?
from scores;

统计一共有多少个不同的属性-----> 共4个

  • 4个属性中大于等于 3.85的 只有2个属性
  • 4个属性中大于等于 3.65的 只有3个属性
  • 4个属性中大于等于 3.50的 只有4个属性
    属性的个数刚好满足期待

第一个表Scores a 我们用来确定属性score
第二个表Scores b 我们用来确定属性rank

sql语句:
第一阶段
找出score中大于X的所有元素 (比如x为3.65:打印出三条数据)

Select b.score From Scores b Where b.score  >= x 

去重 (打印出2个不一样的属性)

Select distanct  b.score From Scores b Where b.score  >= x

第二阶段

Select count(distanct b.score)  From Scores b Where b.score  >= x )as ‘rank’
统计一共有多少个不一样的属性
对于属性score来说(X)rank
4.00(针对4.00,整个表中满足>=4有2个,去重后1个)1
4.001
3.85(针对3.85,整个表中满足>=3.85有3个,去重后2个)2
3.65 (针对3.65,整个表中满足>=3.85有5个,去重后3个)3
3.653
3.50 (针对3.50,整个表中满足>=3.50有5个,去重后4个)4

第三阶段
替换x:x就是score的所有数据,定义新表Scores a,用a.score

Select count(distanct b.score)  From Scores b Where b.score  >=  a.score  )as ‘rank’

第四阶段
完善

Select
	 a.score,Select count(distanct b.score)  From Scores b Where b.score  >=  a.score  )as ‘rank’
From
	Scores a
order by 
	a.Score DESC

总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值