我在我的数据库中有学生的毕业学位记录。学生可能只有一个毕业学位,一些学生可能有一个以上的毕业学位。
rollno | pgdegree | score
--------------------------
0001 | 41 | 56
0002 | 42 | 78
0002 | 49 | 75
0003 | 48 | 77
这里没有。 0002 不止一次而且没有。 0001,0003 只有一次。
我想要我想要的输出:
rollno | pgdegree1 | score1 | pgdegree2 | score2
------------------------------------------------
0001 | 41 | 56 | |
0002 | 42 | 78 | 49 | 75
0003 | 48 | 77 | |
注意:在我的数据库中,任何学生只能有一个或两个帖子渐变。不超过两个PG学位。
答案 0 :(得分:1)
这是另一个使用ROW_NUMBER()
和条件聚合来保存一些不必要的SELECT的解决方案:
SELECT s.rollno,
MAX(CASE WHEN s.rnk = 1 THEN s.pgdegree END) AS pgdegree1,
MAX(CASE WHEN s.rnk = 1 THEN s.score END) AS score1,
MAX(CASE WHEN s.rnk = 2 THEN s.pgdegree END) AS pgdegree2,
MAX(CASE WHEN s.rnk = 2 THEN s.score END) AS score2
FROM
(
SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY t.rollno ORDER BY t.pgdegree, t.score) AS rnk
FROM YourTable t
) s
GROUP BY s.rollno
答案 1 :(得分:1)
如果可用于rollno,请自行LEFT JOIN
添加第二个pgdegree。 NOT EXISTS
只返回pgdegree最低的行为t1.pgdegree。
select t1.rollno, t1.pgdegree, t1.score, t2.pgdegree, t2.score
from tablename t1
left join tablename t2
on t1.rollno = t2.rollno and t1.pgdegree < t2.pgdegree
where not exists (select * from tablename t3
where t1.rollno = t3.rollno
and t1.pgdegree > t3.pgdegree)