题解 | #SQL 27.每类试卷得分前3名#

每类试卷得分前3名

http://www.nowcoder.com/practice/255aa1863fe14aa88694c09ebbc1dbca

明确题意:

找到每类试卷得分的前3名,如果两人最大分数相同,选择最小分数大者,如果还相同,选择uid大者


问题分解:

  • 统计每类试卷上每个用户的排名,生成子表 t_tag_uid_rank:
    • 统计每个用户在每类试卷上的最大最小分,生成子表 t_uid_tag_score :
      • 关联试卷作答表和试卷信息表:exam_record JOIN examination_info USING(exam_id)
      • 按用户ID和试卷类别分组:GROUP BY uid, tag
      • 统计最大最小分:MAX(score) AS max_score, MIN(score) AS min_score
    • 计算排名,按类别分区按最大分、最小分、用户ID降序计算窗口内的排名:
      • ROW_NUMBER() over (PARTITION BY tag ORDER BY max_score DESC, min_score DESC, uid DESC) as ranking
  • 筛选排名前三:WHERE ranking <= 3

细节问题:

  • 表头重命名:as

完整代码:

SELECT tag, uid, ranking
FROM (
    SELECT tag, uid,
        ROW_NUMBER() over (
            PARTITION BY tag
            ORDER BY max_score DESC, min_score DESC, uid DESC
        ) as ranking
    FROM (
        SELECT uid, tag, MAX(score) AS max_score, MIN(score) AS min_score
        FROM exam_record JOIN examination_info USING(exam_id)
        GROUP BY uid, tag
    ) as t_uid_tag_score
) as t_tag_uid_rank
WHERE ranking <= 3;
SQL进阶 文章被收录于专栏

SQL进阶step by step

全部评论

相关推荐

我冲冲冲冲冲:泪目了,好想选自己想选的答案啊
点赞 评论 收藏
分享
24 1 评论
分享
牛客网
牛客企业服务