📢📢📢📣📣📣
哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10年DBA工作经验
一位上进心十足的【大数据领域博主】!😜😜😜
中国DBA联盟(ACDU)成员,目前从事DBA及程序编程
擅长主流数据Oracle、MySQL、PG 运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。
✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】💞💞💞
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
文章目录
🐴 1.SQL题目概述
表结构: Scores +-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | score | decimal | +-------------+---------+ Id是该表的主键。 该表的每一行都包含了一场比赛的分数。Score是一个有两位小数点的浮点值。
🚀题目:
编写 SQL 查询对分数进行排序。排名按以下规则计算:
1.分数应按从高到低排列。
2.如果两个分数相等,那么两个分数的排名应该相同。
3.在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
4.按 score 降序返回结果表。
🚩查询结果如下例所示 输入: Scores 表: +----+-------+ | 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 | +-------+------+
🐴 2.解题思路
MySQL8.0 中可以利用 DENSE_RANK()个窗口函数实现上述排名,
需要注意的一点是 as 后的别名,千万不要与前面的函数名重名,否则会报错
Oracle中直接有对应的开窗函数 DENSE_RANK()处理
邦德这里使用了数据库自带的开窗函数来解题,如果小伙伴们还有其他解题思路,欢迎评论区留言交流~
🐴 3.方法实现
🌈Oracle实现
select score,dense_rank() over(order by score desc) rank from Scores;
🌈MySQL实现
SELECT score, DENSE_RANK() OVER w AS ‘rank’, FROM Scores WINDOW w AS (ORDER BY score desc);
🐴 4.代码测试
🌈Oracle实现
执行代码,开始测试
与测试结果一致,测试成功!
🌈MySQL实现
执行代码,开始测试
与测试结果一致,测试成功!
🐴 5.知识点小结
🌀开窗函数语法 function_name(,…) over(<partition_Clause><windowing_Clause>); function_name():函数名称 argument:参数 over( ):开窗函数 partition_Clause:分区子句,数据记录集分组,group by… order by_Clause:排序子句,数据记录集排序,order by… windowing_Clause:开窗子句,定义分析函数在操作行的集合,三种开窗方式:rows、range、Specifying 注:使用开窗子句时一定要有排序子句!!! ———————————————— 🌀常用分析函数 row_number() over(partition by … order by …) rank() over(partition by … order by …) dense_rank() over(partition by … order by …) count() over(partition by … order by …) max() over(partition by … order by …) min() over(partition by … order by …) sum() over(partition by … order by …) avg() over(partition by … order by …) first_value() over(partition by … order by …) last_value() over(partition by … order by …) lag() over(partition by … order by …) lead() over(partition by … order by …)