面试sql题

面试问的Sql:给你一个表里面有六列,第一列为学生id,其余五列为该学生的各科成绩,请你利用sql输出两列,第一列为学生id,第二列为该学生前三高的成绩拼接
这个咋写,有牛油会嘛,说下思路也行
全部评论
SELECT stu_id ,CONCAT( MAX(CASE WHEN rnk = 1 THEN score END),'|' ,MAX(CASE WHEN rnk = 2 THEN score END),'|' ,MAX(CASE WHEN rnk = 3 THEN score END) ) AS top_grade FROM ( SELECT * ,row_number() over(PARTITION BY gt.stu_id ORDER BY score DESC) AS rnk FROM ( SELECT stu_id, '语文' AS SUBJECT, cn_grade AS score FROM grade UNION ALL SELECT stu_id, '数学' AS SUBJECT, mat_grade AS score FROM grade UNION ALL SELECT stu_id, '英语' AS SUBJECT, en_grade AS score FROM grade UNION ALL SELECT stu_id, '物理' AS SUBJECT, phcs_grade AS score FROM grade UNION ALL SELECT stu_id ,'化学' AS SUBJECT, chmc_grade AS score FROM grade ) gt ORDER BY stu_id ) a GROUP BY stu_id
5 回复 分享
发布于 2023-08-16 10:46 上海
先用窗口函数求出各个学生前三高的成绩 然后用group_concat函数聚合
2 回复 分享
发布于 2023-08-10 21:41 北京
平常写 hive,不确定 mysql 是不是可以这么写。 一行转一列“行转列”已经有大佬写了。这种方法好在如果要求 rank/dense_rank 并列也能支持。 如果不想写“行转列”,还可以把六列拼成 array 再 sort_array,升序的话取最后3个。 这种方法缺点就是不支持 rank/dense_rank 的并列情况了,就像 row_number 排序
点赞 回复 分享
发布于 2023-08-18 18:26 北京
那个公司呀
点赞 回复 分享
发布于 2023-08-28 17:20 陕西

相关推荐

评论
2
28
分享

创作者周榜

更多
牛客网
牛客企业服务