2011-09-24 39 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+排名前你的人数