单行中的多条记录

时间:2016-08-16 09:52:20

标签: sql postgresql

我在我的数据库中有学生的毕业学位记录。学生可能只有一个毕业学位,一些学生可能有一个以上的毕业学位。

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学位。

2 个答案:

答案 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)