【分数排名】

        欢迎来到 SQL 语句使用指南的专栏!📊 无论你是刚接触数据库的新手,还是希望精进技能的开发者,这里都能为你提供实用的 SQL 知识与技巧。​

        SQL 作为数据查询与管理的核心语言,早已成为后端开发、数据分析、运维等岗位的必备技能。从简单的单表查询到复杂的多表关联,从数据筛选到聚合分析,掌握 SQL 不仅能提升工作效率,更能帮你从海量数据中挖掘有价值的信息🔍。​

        在这个专栏里,我们会从基础语法讲起,逐步深入到高级用法。你将学到如何通过 JOIN 语句实现多表关联查询,如何用子查询解决复杂逻辑,如何优化 SQL 性能以应对大数据量场景…… 每一篇文章都会搭配具体案例,让抽象的语法变得通俗易懂💡。​

        无论你是想解决工作中遇到的 SQL 难题,还是为面试做准备,都不妨跟着我们的节奏一步步探索。如果在学习过程中有任何疑问,欢迎在评论区留言交流,让我们一起在实践中成长,真正做到学以致用,让 SQL 成为你职业生涯中的得力工具🚀!

目录

一.题目描述

二.解题思路

三.代码

四.重点掌握

1.dense_rank()函数

2.over关键字


一.题目描述

表: Scores

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| score       | decimal |
+-------------+---------+
id 是该表的主键(有不同值的列)。
该表的每一行都包含了一场比赛的分数。Score 是一个有两位小数点的浮点值。

编写一个解决方案来查询分数的排名。排名按以下规则计算:

  • 分数应按从高到低排列。
  • 如果两个分数相等,那么两个分数的排名应该相同。
  • 在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。

按 score 降序返回结果表。

查询结果格式如下所示。

示例 1:

输入: 
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    |
+-------+------+

二.解题思路

①使用dense_rank()函数,进行紧密排序(即:相同分数可以并列,并且下一位不会跳号)

②使用over,给dense_rank()函数指明排序范围是按照score字段进行排序,并且是降序排序

三.代码

select score, dense_rank() over (order by score desc) as 'rank'
from Scores

四.重点掌握

1.dense_rank()函数

在一定范围内(须通过over指定),紧密排序,即:允许并列、不会跳号

2.over关键字

用于给dense_rank()函数指明排序的目标范围。

举例:dense_rank() over (order by score desc)的意思是,按照score字段进行排序,并指明了是降序排序,可以并列、不能跳号。

以上就是本篇文章的全部内容,希望可以帮到你,喜欢的话可以留个免费的关注呦~~~

### 关于C语言贪吃蛇游戏中的分数排名功能 为了实现分数排名的功能,在《C语言实现贪吃蛇小游戏详解》中提及的游戏框架基础上进行了扩展[^1]。此部分主要涉及两个方面:一是记录玩家得分;二是设计并实现排行榜机制。 #### 记录玩家得分 在每次蛇吃到食物之后,应该增加当前玩家的得分。这通常是在`CreateFood()`函数调用成功后完成的操作。可以在结构体`Snake`中添加一个成员变量用于存储当前得分: ```c typedef struct Snake { int score; // ...其他原有属性... } Snake; ``` 每当生成新的食物并且被蛇吞食时,则更新这个score值: ```c if(/*判断是否吃到食物*/) { snake->score += POINTS_PER_FOOD; // 假设每颗食物得分为POINTS_PER_FOOD分 } ``` #### 排行榜的设计与实现 对于简单的单机版应用来说,可以考虑使用文件来保存历史最高成绩列表。当游戏结束时读取现有数据并与新获得的成绩对比,如果优于已有最低名次则将其加入其中,并按降序重新排列前N位(如Top 10)。以下是简化版本的代码片段展示如何操作这些过程: ```c #define MAX_RANKINGS 10 // 定义排行榜项的数据结构 struct RankingEntry { char name[20]; unsigned short score; }; // 将最新的成绩写入到排行榜里 void updateRankings(const struct Snake *snake) { FILE* fp = fopen("rankings.dat", "rb+"); if (!fp) { /* 文件不存在 */ fp = fopen("rankings.dat", "wb"); fclose(fp); fp = fopen("rankings.dat", "rb+"); } struct RankingEntry entries[MAX_RANKINGS], new_entry; size_t read_count = fread(entries, sizeof(struct RankingEntry), MAX_RANKINGS, fp); strcpy(new_entry.name, "Player"); // 可以让用户自定义名字 new_entry.score = snake->score; bool inserted = false; for(int i=0 ;i<read_count && !inserted;i++) { if (new_entry.score >= entries[i].score){ memmove(&entries[i+1],&entries[i], (read_count-i)*sizeof(struct RankingEntry)); memcpy(&entries[i],&new_entry,sizeof(struct RankingEntry)); inserted=true; } } if(!inserted && read_count < MAX_RANKINGS){ // 如果还有空间就直接追加进去 fwrite(&new_entry, sizeof(struct RankingEntry), 1, fp); }else{ fseek(fp, SEEK_SET, 0); // 移动指针回到开头准备覆盖旧数据 fwrite(entries, sizeof(struct RankingEntry), MIN(read_count,(size_t)MAX_RANKINGS), fp); } fclose(fp); } // 显示排行榜给用户查看 void showRankings() { printf("\n\n=== Top Scores ===\n"); FILE* fp = fopen("rankings.dat","rb"); if (!fp) return ; struct RankingEntry entry; while(fread(&entry,sizeof(entry),1,fp)){ printf("%s : %hu points\n", entry.name, entry.score); } fclose(fp); } ``` 上述代码实现了基本的分数统计和排行榜管理逻辑。实际开发过程中可能还需要考虑到更多细节问题,例如防止重复提交相同用户的多次高分、支持多平台兼容性等特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值