2012-07-24 2 views
0
Student Subj Period Score 
------------------------- 
A   Math 100  50 
A   Hist 100  100 
A   Sci 200  70 
B   Math 100  50 
B   Hist 100  50 

각 학생의 최고 점수를 묻습니다. 점수는 'B'다음 바닥에 하나를 선택하십시오.이 할 수없는 경우로 (모두 같은 경우plsql은 최대 값을 비교하여 얻습니다.

, 은 아무것도을 선택합니다.

을 나는 최대()와 분을 사용하여 힘든 시간을 보내고있어() 및 그룹에 의해 정확한 결과를 얻을 수 결과 당신은 (나는이 PL/SQL의 언급에서 오라클에 가정) 분석 기능을 사용하려면이

Student Subj Period Score 
------------------------- 
A   Hist 100  100 
B   Hist 100  50 
+1

"맨 아래"란 무엇입니까? 테이블에 자연 순서가 없습니다. – zerkms

+0

사실 내 의도는 .. 결과에 이미 'Hist'가 있으면 다음 결과에 대해 'Hist'보다 'Math'를 선택하는 것이 좋습니다. 하지만 그것은 하나의 쿼리에서 가능한 것 같지 않습니다 – sayhaha

답변

2

과 같아야합니다.

select Student, Subj, Period, Score 
from (select t.*, 
      row_number() over (partition by student order by score desc) as seqnum 
     from t 
    ) t 
where seqnum = 1 
+0

이런 ....... nius! – sayhaha

+0

OP가 요청하지 않았지만 쿼리가 확실하지 않습니다. 단순히 기간과 주제를 ORDER BY 절에 추가하여 확정 할 수 있습니다. – dbenham

1

고든의 대답은 확실히 잘 작동하며 많은 데이터베이스 엔진에서 지원되는 ANSI 구문을 사용합니다.

오라클은 ANSI와 다른 구문을 사용하지만 하위 쿼리가 필요하지 않습니다. 그것은 적어도 고든의 대답을 수행합니다 (약간 빨라지 겠지만 확실하지는 않습니다). 그것은 KEEP LAST 확장을 사용하여 함수를 집계합니다.

select student, 
     max(subj) keep(dense_rank last order by score, period) as subj, 
     max(period) keep(dense_rank last order by score, period) as period, 
     max(score) as score 
    from grades 
group by student 
; 

주 - 명시 적으로 임의의 결과를 제공하고자하지 않는 한, 당신은 항상 데이터가로드 된 방법 주어진 데이터 세트에 관계없이 항상 같은 대답을 줄 것이다 즉, 확정적인 답변을 제공하는 쿼리를 구성해야합니다. 위의 쿼리를 구성하여 가장 높은 점수 순으로 정렬하고 가장 높은 순위 순으로 정렬했습니다. 여전히 동점이 있으면 max (subj)가 반환됩니다.

관련 문제