2013-12-10 2 views
1

학생 ID와 평점이 포함 된 표가 있습니다.PostgreSQL에서 다른 표를 하나 빼기

_____________ 
| sID | GPA | 
------------- 
| 1 | 3.7 | 
| 2 | 3.9 | 
| 3 | 3.6 | 
| 4 | 3.7 | 
| 5 | 3.1 | 
| 6 | 3.9 | 

최고 또는 두 번째로 높은 평점을받은 학생 만 제공하는 테이블을 만들고 싶습니다. 즉, 나는이 결과 원하는 :

SELECT * 
FROM gpaTable 
WHERE gpa in (
     SELECT max(gpa) FROM gpaTable) 

이 저를 제공합니다

_____________ 
| sID | GPA | 
------------- 
| 2 | 3.9 | 
| 6 | 3.9 | 
| 1 | 3.7 | 
| 4 | 3.7 | 

그렇게하기를, 나는 나에게 가장 높은 점수를 일치하는 모든 학생을 제공하는 쿼리를 작성하여 시작 :

| sID | GPA | 
------------- 
| 2 | 3.9 | 
| 6 | 3.9 | 

내가 빼기 전체 원래 타에서이 결과에 원하는뿐만 아니라 두 번째로 높은를 얻으려면 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) 
    ) 

는 쿼리가 나에게 최대 GPA들 적은 GPA들의 최대 GPA들의 테이블에또는의 테이블에 표시되는 모든 행을 지정 (또는라고한다)라고

정말 도움을 주시면 고맙겠습니다.

답변

1

당신은 이런 식으로 작업을 수행 할 수 있습니다 : 당신은, 예를 들어, LIMIT를 사용할 수

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

아이디어는 첫 번째 솔루션과 유사 MAX 제외하고 주문으로 대체되고 LIMIT 2

Demo on sqlfiddle.

1

subselect에서 상위 2 항목을 선택하는 것이 쉽지 않을까요?

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; 
관련 문제