[英]Subtracting one table from another in PostgreSQL
我有一张包含学生ID和GPA的表格。
_____________
| sID | GPA |
-------------
| 1 | 3.7 |
| 2 | 3.9 |
| 3 | 3.6 |
| 4 | 3.7 |
| 5 | 3.1 |
| 6 | 3.9 |
我想创建一个表格,只给出GPA最高或次高的学生。 换句话说, 我想要这个结果:
_____________
| sID | GPA |
-------------
| 2 | 3.9 |
| 6 | 3.9 |
| 1 | 3.7 |
| 4 | 3.7 |
为此,我首先编写了一个查询,为我提供了所有匹配得分最高的学生:
SELECT *
FROM gpaTable
WHERE gpa in (
SELECT max(gpa) FROM gpaTable)
这给了我:
| sID | GPA |
-------------
| 2 | 3.9 |
| 6 | 3.9 |
为了获得第二高,我想从整个原始表中减去此结果,然后重复再次找到max的查询。
我认为它看起来像这样,但是, 我无法做到这一点。
SELECT *
FROM gpaTable
WHERE gpa IN (
SELECT *
FROM gpaTable
WHERE gpa in (
SELECT max(gpa) FROM gpaTable)
)
OR
(SELECT *
FROM gpaTable
WHERE NOT EXISTS IN
(SELECT *
FROM gpaTable
WHERE gpa in (
SELECT max(gpa) FROM gpaTable)
)
在英语中,查询说(或应该说) 给我最大GPA表中出现的每一行 或 在较小GPA的最大GPA表中
我真的很感激任何帮助!
选择subselect中的前2个条目会不容易? 你可以,例如,使用LIMIT
:
SELECT *
FROM gpaTable
WHERE gpa in (SELECT DISTINCT gpa FROM gpaTable ORDER BY gpa DESC LIMIT 2) ORDER BY gpa;
你可以这样做:
select *
from gpaTable
where gpa in (
select distinct gpa
from gpaTable
order by gpa desc
limit 2
)
这个想法类似于你的第一个解决方案,除了MAX
被排序和LIMIT 2
取代
SELECT sid, gpa
FROM (
select sid,
gpa,
dense_rank() over (order by gpa desc) as rnk
from gpaTable
) t
where rnk <= 2
order by sid;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.