2011-09-24 38 views
1

SQL MAX聚合函數將允許您選擇組中的頂部元素。有沒有辦法爲每個組選擇頂部n元素?SQL - 在組中選擇'n'最大元素

舉例來說,如果我有這樣舉行了他們的職級劃分,並希望每格頂部兩個用戶的用戶的表...

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

我想查詢以某種方式回報用戶2,3 ,4

如果很重要,我使用MySQL。

+0

我已經添加了[mysql +最大的n-per-group](http://stackoverflow.com/questions/tagged/greatest- n-per-group + mysql?sort = votes&pagesize = 50)tags(你可以按照該鏈接看到類似的問題) –

回答

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

試試這個:

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

他問的是mysql,而不是mssql。 :) –

+0

其實幾乎所有其他主要的數據庫管理系統都會支持 - 不僅僅是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 
); 

BTW:大多數人算從零開始行列:人頭位置有秩= 1,第二個得到秩= 2,等等。在這種情況下,你的排名是1+排名前你的人數