2013-12-10 56 views
1

我有一個包含學生ID和他們的GPA的表。在PostgreSQL中從另一個表中減去一個表

_____________ 
| 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 | 

爲了得到第二高的爲好,我想這個結果從整個原始TA ble,然後重複再次查找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) 
    ) 

在英語中,詢問說(或應該說)給我出現在最大的GPAOR在較小的GPA的最大的GPA的表的表的每一行

我非常感謝任何幫助!

回答

1

你可以這樣說:

select * 
from gpaTable 
where gpa in (
    select distinct gpa 
    from gpaTable 
    order by gpa desc 
    limit 2 
) 

的想法是類似於你的第一個解決方案,除了MAX替換排序和LIMIT 2

Demo on sqlfiddle.

1

僅僅選擇子選擇中的前2項是不是更容易?你可以,例如,使用LIMIT

SELECT * 
FROM gpaTable 
WHERE gpa in (SELECT DISTINCT gpa FROM gpaTable ORDER BY gpa DESC LIMIT 2) ORDER BY gpa; 
+0

我編輯你的答案有點使其工作如何我想要的 - 它確實如此。好建議! – CodyBugstein

1
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; 
相關問題