SQL练习(二)-- 排名问题

本文介绍了一种使用SQL查询解决分数排名问题的方法,通过自连接和分组统计实现了分数排名的计算,确保了相同分数的排名一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

leetcode--将分数进行排名,并按降序排列,其中分数相同排名也应相同。

输入:

+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+
输出:

+-------+------+
| Score | Rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+
解题思路:

原文链接:

www.cnblogs.com/imjch/p/4411793.html

SELECT s2.Score,s1.Rank From
(
SELECT S1.Score, COUNT(*) as Rank
    FROM 
        (SELECT DISTINCT Score from Scores) as S1,
        (SELECT DISTINCT Score from Scores) as S2 
        Where S1.Score<=S2.Score
        Group By S1.Score
) s1 ,Scores s2 
WHERE s1.Score = s2.Score Order BY s2.Score desc


其中子查询:
SELECT S1.Score, COUNT(*) as Rank
    FROM 
        (SELECT DISTINCT Score from Scores) as S1,
        (SELECT DISTINCT Score from Scores) as S2 
        Where S1.Score<=S2.Score
        Group By S1.Score
)
效果:

T~SB86]K8(XLAMF`3EB~(EA

进一步拆解:

SELECT S1.Score , Count(*) S2.Score as Rank
    FROM 
        (SELECT DISTINCT Score from Scores) as S1,
        (SELECT DISTINCT Score from Scores) as S2 
        Where S1.Score<=S2.Score

效果:

3(3QUSY2A[)TW]2`_SVD[TA

      可以看到,S1.Score与S2.Score进行<=操作之后,得到了这样的结果,我们知道,俩字段的比较操作,会将左边表的字段依次与右边表的字段值逐个比较,这里我们可以看到,对于左表的3.5来说,右边表有四个值满足<=的比较条件,于是,左边表的3.5会出现4次,而右边的值则是满足比较条件的值。于是,当所有的字段比较完成之后,我们可以总结出,因为每一个字段在右边去比较的时候,总会将比其小的值筛一个出去(因为是Distinct操作,不会存在重复值),这么一来,左边表的字段的值每迭代到一个更大的值,其在结果集中出现的次数一定比上一个次小值少一次,最后将其做Group By操作,这么一来,就得到了“排序”效果。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值