2011-09-24 2 views
1

SQL MAX 집계 함수를 사용하면 그룹의 최상위 요소를 선택할 수 있습니다. 각 그룹에 대해 상위 n 요소를 선택하는 방법이 있습니까? 내가 쿼리가 어떻게 든 사용자 2,3에게 반환 할 것SQL - 그룹에서 'n'개의 가장 큰 요소를 선택하십시오.

Users 
userId | division | rank 
1  | 1  | 1 
2  | 1  | 2 
3  | 1  | 3 
4  | 2  | 3 

예를 들어

, 내가 그들의 부문 순위를 개최하고 부문 별 상위 두 명의 사용자를 원하는 사용자의 테이블이 있다면 ... , 4

중요한 경우 MySQL을 사용하고 있습니다.

+0

[mysql + best-n-per-group] (http://stackoverflow.com/questions/tagged/greatest- 그룹당 n + mysql? sort = votes & pagesize = 50) 태그 (유사한 질문을 보려면 해당 링크를 따라 가면됩니다.) –

답변

0
SELECT * FROM (
     SELECT u1.userid, u1.rank 
     FROM users u1 
     GROUP BY u1.division 
     HAVING u1.rank = MAX(u1.rank) 
     ORDER BY u1.rank DESC 
    UNION 
     SELECT u2.userid, u2.rank 
     FROM users u2 
     WHERE u2.id <> u1.id 
     GROUP BY u2.division 
     HAVING u2.rank = MAX(u2.rank) 
     ORDER BY u2.rank DESC 
    ) ranking 
    ORDER BY ranking.userid 
1
select * from users as t1 
where (select count(*) from users as t2 
     where t1.division = t2.division and t2.rank > t1.rank) <2 
order by division,rank 
0

이 시도 : BTW

SELECT * 
    FROM (
     SELECT *, row_number() OVER (PARTITION BY division ORDER BY rank DESC) as rn 
      FROM users 
     ) as extended_users 
    WHERE rn <= 2 
ORDER BY userId 
+2

그는 mssql이 아니라 mysql에 대해 묻습니다. :) –

+0

실제로 거의 모든 다른 주요 DBMS가이를 지원할 것입니다. MS-SQL뿐만 아니라 ... –

+0

PostgreSQL과 SQL Server에서 작동하기 때문에 MySQL에서도 작동합니다. 실수해서 죄송합니다. – DavidEG

0
SELECT * from users u0 
WHERE NOT EXISIS (
    SELECT * FROM users u1 
    WHERE u1.division = u0.division 
    AND u1.rank >= u0.rank +2 
); 

: 대부분의 사람들이 제로에서 시작 대열 수 : 여론 조사 위치 가져 순위 = 1, 두 번째는 순위 = 2, 등등 얻는다 . 이 경우 순위가 1 + 순위보다 앞선 사람의 수입니다.

관련 문제