如何基于total字段求和结果计算学生排名?
按learner_id计算总分并排名的实现方案
SQL 实现方式
- 先按
learner_id分组求和total,得到每位学生的总分:
SELECT learner_id, SUM(total) AS total_score FROM your_table_name GROUP BY learner_id;
- 基于总分添加排名,根据不同需求选择对应函数:
- 同分排名相同,后续排名跳跃(如1,1,3):使用
RANK()
SELECT learner_id, SUM(total) AS total_score, RANK() OVER (ORDER BY SUM(total) DESC) AS ranking FROM your_table_name GROUP BY learner_id ORDER BY ranking;- 同分排名相同,后续排名连续(如1,1,2):使用
DENSE_RANK()
SELECT learner_id, SUM(total) AS total_score, DENSE_RANK() OVER (ORDER BY SUM(total) DESC) AS ranking FROM your_table_name GROUP BY learner_id ORDER BY ranking;- 每个排名唯一(同分按数据顺序排):使用
ROW_NUMBER()
SELECT learner_id, SUM(total) AS total_score, ROW_NUMBER() OVER (ORDER BY SUM(total) DESC) AS ranking FROM your_table_name GROUP BY learner_id ORDER BY ranking; - 同分排名相同,后续排名跳跃(如1,1,3):使用
Python Pandas 实现方式
假设数据已加载到DataFramedf中:
- 第一步:分组求和得到总分
total_scores = df.groupby('learner_id')['total'].sum().reset_index(name='total_score')
- 第二步:添加排名列,对应不同规则:
- 同分排名相同,后续跳跃:
total_scores['ranking'] = total_scores['total_score'].rank(method='min', ascending=False).astype(int)- 同分排名相同,后续连续:
total_scores['ranking'] = total_scores['total_score'].rank(method='dense', ascending=False).astype(int)- 排名唯一(同分按原数据顺序排):
total_scores['ranking'] = total_scores['total_score'].rank(method='first', ascending=False).astype(int) - 最后按排名排序:
total_scores_sorted = total_scores.sort_values(by='ranking')
内容的提问来源于stack exchange,提问作者Oblongata
相关产品推荐
相关产品推荐

