2012-03-08 3 views
0

쿼리에 걸려있는 종류. 나는 모든 퀴즈의 우승자를 찾아 낼 방법그룹 당 최고 레코드를 찾는 SQL

ID of the player, 
QuizID, 
Number of seconds it took to complete the quiz, 
Number of correct answers 

을 : 나는 포함 퀴즈 결과의 테이블이 있습니다. = 정답의 최대 개수와 모든 퀴즈 ID의 최소 초 수를 가진 플레이어

나는 여러 가지 방법을 시도했지만 올바른 결과를 얻을 수 없습니다. 누군가가 도와 줄 수 있기를 바랍니다.

감사합니다.

+1

동일한 답변과 동일한 시간을 가진 두 명의 플레이어가 있다면 어떻게 될까요? –

+0

그리고 한 플레이어가 최대 정답을 갖고 다른 플레이어가 최소 초를 가졌 으면 어떨까요? –

+0

AT : Mark 정답과 시간이 같은 2 명의 플레이어가 있다면, 먼저 입력 한 플레이어가되므로 가장 낮은 playerID가 여기에서 수행합니다. AT : ypercube 가장 정확한 답변을 가진 플레이어의 시간이 가장 적은 플레이어를 원합니다. – gen

답변

4

CTE는 퀴즈의 각 플레이어의 위치를 ​​계산합니다. 기본 쿼리는 첫 번째 위치 만 필터링합니다.

; with quiz as (
    select QuizId, PlayerID, row_number() over (partition by QuizId order by count_answers desc, seconds) rownum 
     from QuizResults 
) 
select * 
from QuizResults 
    inner join Quiz 
     on QuizResults.QuizID = Quiz.QuizID 
     and QuizResults.PlayerID = Quiz.PlayerID 
where rownum = 1 
+0

나는 '오름차순'과 'desc'를 바꿨다. 왜냐하면 나에게 정확한 답이 0 인 선수를 부여했기 때문이다 :) 지금 완벽하게 작동한다! – gen

+0

그래, 오류를보고 편집했지만 잘못된 버전이 있습니다. –

+0

오, 고마워 ^^ 나는 '파티션 바이'가 존재한다는 것을 몰랐다. – gen

0

확인되지 않은이 :

select ID 
from your_table 
group by QuizId 
having max(count_answers) and min(seconds) 
+0

이것은 그룹당 최고 기록이 아닌 최고 기록만을 보여줍니다. –

관련 문제