使用函数
Scores表中没有rank属性,其实这里用到一个函数rank() over()
此函数会自动的赋给每行一个排名,用在select里面
Select
s.score,
RANK() OVER(
Order By s.score Desc)'rank' //有的版本要求自定义名rank需要引号,有的不需要
From
Scores s
测试数据
运行结果:
score | rank |
---|---|
4.00 | 1 |
4.00 | 1 |
3.85 | 3--------->2 |
3.65 | 4--------->3 |
3.65 | 4--------->3 |
3.50 | 6--------->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;
score | rank |
---|---|
4.00 | 1 |
4.00 | 1 |
3.85 | 2 |
3.65 | 3 |
3.65 | 3 |
3.50 | 4 |
自定义实现
除了使用函数之外
可以看出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.00 | 1 |
3.85(针对3.85,整个表中满足>=3.85有3个,去重后2个) | 2 |
3.65 (针对3.65,整个表中满足>=3.85有5个,去重后3个) | 3 |
3.65 | 3 |
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
总结: