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