查询学生学科排名

本文探讨了如何使用SQL语句实现数据集的排名,并详细解释了查询优化的方法,包括利用JOIN操作、GROUP BY和ORDER BY子句进行高效的数据排序。

表结构如下:
成绩表

要求结果:
这里写图片描述
sql语句:

SELECT a.*, count(*) as rank 
FROM chengji a
JOIN chengji b ON a.xueke = b.xueke AND a.score <= b.score
GROUP BY a.xueke,a.name
ORDER BY a.xueke asc,a.score desc
在 Hive 中实现按照学科进行排名查询,可以借助窗口函数(Window Function)来完成。通常使用 `ROW_NUMBER()`、`RANK()` 或 `DENSE_RANK()` 函数,结合 `PARTITION BY` 子句对每个学科进行独立排名。 以下是一个示例查询语句,假设有一个名为 `score_info` 的表,包含字段 `course_id`(课程编号)、`student_id`(学生编号)和 `score`(成绩),目标是按照每个学科的成绩从高到低进行排名: ```sql SELECT course_id, student_id, score, ROW_NUMBER() OVER (PARTITION BY course_id ORDER BY score DESC) AS row_num, RANK() OVER (PARTITION BY course_id ORDER BY score DESC) AS rank_num, DENSE_RANK() OVER (PARTITION BY course_id ORDER BY score DESC) AS dense_rank_num FROM score_info; ``` ### 说明: - `PARTITION BY course_id`:表示按照学科进行分组,每个学科独立排名。 - `ORDER BY score DESC`:表示按照成绩从高到低排序。 - `ROW_NUMBER()`:为每条记录分配一个唯一的序号,即使成绩相同,序号也不同。 - `RANK()`:允许并列排名,但后续排名会跳过并列人数,例如两个第一名后,下一个将是第三名。 - `DENSE_RANK()`:允许并列排名,但后续排名不会跳过,例如两个第一名后,下一个将是第二名 [^3]。 如果只想查询每个学科排名前 N 的记录,可以在外部查询中添加 `WHERE` 条件。例如,获取每个学科前 3 名: ```sql SELECT * FROM ( SELECT course_id, student_id, score, ROW_NUMBER() OVER (PARTITION BY course_id ORDER BY score DESC) AS row_num FROM score_info ) ranked_scores WHERE row_num <= 3; ``` ### 排序与分组 - 在 Hive 中,`ORDER BY` 用于全局排序,而 `SORT BY` 用于局部排序,`DISTRIBUTE BY` 用于控制数据的分布方式。 - 当需要按照学科进行分组并排序时,应使用 `OVER (PARTITION BY ... ORDER BY ...)` 结构,这样可以在每个分组内进行独立排序 [^1]。 ### 示例数据 假设 `score_info` 表中的数据如下: | course_id | student_id | score | |-----------|------------|-------| | 01 | 1001 | 85 | | 01 | 1002 | 90 | | 01 | 1003 | 85 | | 02 | 1004 | 75 | | 02 | 1005 | 80 | | 02 | 1006 | 80 | 执行上述 SQL 查询后,结果如下: | course_id | student_id | score | row_num | rank_num | dense_rank_num | |-----------|------------|-------|---------|----------|----------------| | 01 | 1002 | 90 | 1 | 1 | 1 | | 01 | 1001 | 85 | 2 | 2 | 2 | | 01 | 1003 | 85 | 3 | 2 | 2 | | 02 | 1006 | 80 | 1 | 1 | 1 | | 02 | 1005 | 80 | 2 | 1 | 1 | | 02 | 1004 | 75 | 3 | 3 | 2 | ### 总结 通过 Hive 的窗口函数,可以灵活地实现按照学科分组并进行排名的需求。不同的排名函数(如 `ROW_NUMBER()`、`RANK()` 和 `DENSE_RANK()`)适用于不同的业务场景,可以根据实际需求选择合适的函数 [^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值