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。
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。
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
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
试试这个:
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
他问的是mysql,而不是mssql。 :) –
其实几乎所有其他主要的数据库管理系统都会支持 - 不仅仅是MS-SQL ... –
它适用于PostgreSQL和SQL Server,所以我认为它也可以在MySQL中使用。对不起,我错了。 – DavidEG
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+排名前你的人数
我已经添加了[mysql +最大的n-per-group](http://stackoverflow.com/questions/tagged/greatest- n-per-group + mysql?sort = votes&pagesize = 50)tags(你可以按照该链接看到类似的问题) –