⭐️ LeetCode解题系列 ⭐️ 178. 分数排名(Oracle dense_rank函数)

@TOC(178. 分数排名)

❤️ 原题 ❤️

编写一个 SQL 查询来实现分数排名。

如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有"间隔"。

diff 复制代码
+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+

例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

diff 复制代码
+-------+------+
| Score | Rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

⭐️ 解题思路 ⭐️

很明显,这是一个排名问题,Oracle 中有四大排名函数:

  • rank函数
  • dense_rank函数
  • row_number函数
  • ntile函数

下面举个例子来展示一下这 4 种函数的作用:

sql 复制代码
create table scores
(   id number(6)
   ,score number(4,2)
);
insert into scores values(1,3.50);
insert into scores values(2,3.65);
insert into scores values(3,4.00);
insert into scores values(4,3.85);
insert into scores values(5,4.00);
insert into scores values(6,3.65);
commit;

select
    id 
   ,score
   ,rank() over(order by score desc) rank               --按照成绩排名,纯排名
   ,dense_rank() over(order by score desc) dense_rank   --按照成绩排名,相同成绩排名一致
   ,row_number() over(order by score desc) row_number   --按照成绩依次排名
   ,ntile(3) over (order by score desc) ntile         --按照分数划分成绩梯队
from scores;

通过以上SQL查询结果可以发现: 如果两个分数相同,RANKDENSE_RANK 函数的分数排名相同,但是 RANK 函数的名次之间会存在"间隔",因此 DENSE_RANK 函数才是符合本题题意的解决方案。

☀️ 解题答案 ☀️

sql 复制代码
select score as "Score",dense_rank() over (order by score desc) as "Rank" from scores;

去 LeetCode 执行一下看看结果吧:

❄️ 写在最后 ❄️

本题的解题说难不难,只要知道这个函数,一下子就能看出解法,不知道的当然可以通过 rownum的方式来实现,但是过于麻烦。


本次分享到此结束啦~

如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。


📚 推荐阅读:DBA 学习之路

如果这篇文章对你有帮助,推荐访问我的 Oracle DBA 系统学习站点,涵盖 100 天完整学习路线:

  • 🔧 Oracle 安装部署 · RMAN 备份恢复 · Data Pump 数据迁移
  • 🏗️ RAC 高可用 · DataGuard 容灾 · 多租户架构
  • 🔍 故障排查 · 升级迁移 · GoldenGate 数据同步

👉 立即访问 ora100.com →

相关推荐
考虑考虑2 小时前
数据库中的EXISTS
运维·数据库·后端
郑州光合科技余经理3 小时前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
毅炼3 小时前
Rover-Suite 开源发布:轻量服务注册中心与网关一体化方案
java·后端·系统架构·gateway
苏三说技术8 小时前
为什么越来越多人用OpenWiki?
后端
IT_陈寒8 小时前
Java里用Stream.parallel()翻车实录,这性能还不如单线程
前端·人工智能·后端
Bs_MoneyMagnet8 小时前
基于springboot+vue的生态果园采摘预约系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·毕业设计·计算机毕业设计
码事漫谈8 小时前
FDE 的起源、形态与真实边界
后端
ServBay9 小时前
Grok Bot 还是 OpenClaw?聊聊真正能替人打杂的 AI 智能体
后端·aigc·grok
掘金挖土9 小时前
前端手摸手跑路之 AI 应用开发(五)
前端·后端
弈栈录9 小时前
LangGraph 入门:用状态机设计可靠的 Agent 工作流
后端·程序员