SQL查询由另一列返回三个最高值的一列“分组”
比方说,我有一个这样的表:SQL查询由另一列返回三个最高值的一列“分组”
Player Score
A 5
B 4
A 3
B 2
A 1
B 1
A 2
B 3
A 4
B 5
我需要一个SQL查询将返回每个玩家最高的三个分数按玩家降序排列“分组”
Player Score
A 5
A 4
A 3
B 5
B 4
B 3
非常感谢任何指针。
根据什么DBMS你使用,你可以以某种形式
在SQL Server 2008中使用ROW_NUMBER可以使用
create table #player
(Player char, Score int)
insert into #player (Player, Score) Values
('A',5),('B',4),('A',3),('B',2),('A',1),('B',1),('A',2),('B',3),('A',4),('B',5)
select * from #player
select Player, Score from
(
select *, ROW_NUMBER() over(partition by Player order by Score desc) as rowNo
from #player
) as tmp
where tmp.rowNo <= 3
drop table #player
我想你在找什么可以在这里找到:
http://www.sql-ex.ru/help/select16.php
基本上,最好的解决方案使用RANK函数。下面是从网站的示例代码:
SELECT maker, model, type FROM
(
SELECT maker, model, type, RANK() OVER(PARTITION BY type ORDER BY model) num
FROM Product
) X
WHERE num <= 3
你只需要修改分区通过部分由你的分数按降序排序。
编辑
根据您将使用MySQL的信息,您将需要进行一些修改上面的查询(与微软SQL工作)。你需要用你自己的RANK实现来替换RANK函数。这并不难。完整的说明可以在这里找到:
http://thinkdiff.net/mysql/how-to-get-rank-using-mysql-query/
会告诉你如何实现一个计数器,可以给你一个排名。
这是老式的(阅读:基本的sql)每组生产top-n的方式。你可以在小组条件下(这里是球员)加入表格,并在右侧选择得分较高的记录;如果有三个或更少这样的记录,则该行是每个组的前n行中的一个。
select player.player, player.score
from Player
left join Player p2
on p2.player = player.player
and p2.score > player.score
group by player.player, player.score
having count(distinct p2.score) < 3
order by 1, 2 desc
替代版本中,你可能会检查,使用不存在:
select player, score
from player
where not exists
(
select p2.player
from Player p2
where p2.player = player.player
and p2.score > player.score
group by p2.player
having count(distinct p2.score) > 3
)
order by 1, 2 desc
这两个版本中关系的表现有所不同 - 而第一个返回一行(由组的性质),需要进行加入到原始表格以显示所有记录,第二个直接从原始表格直接显示所有数据和关系。
你可以找到Demo at Sql Fiddle。
谢谢,非常有帮助。 – user1350000 2012-04-29 19:47:05
在SQL服务器:
select p.player, p.score
from PS p
where p.score in (select top 3 score from PS
where player = p.player order by score desc)
order by p.player asc, p.score desc
在MySQL的:
select p.player, p.score
from PS p
where p.score in (select score from PS
where player = p.player order by score desc limit 3)
order by p.player asc, p.score desc
可否请你参加编写问题一段时间吗?它应该至少包含[您尝试过的]的清晰描述(http://mattgemmell.com/2008/12/08/what-have-you-tried/)。 – Ben 2012-04-23 20:03:07
您使用的是什么RDBMS和版本? – Lamak 2012-04-23 20:05:36
我目前使用的是OpenOffice.org Base 3.3,但最终会在mySQL 5上实现此功能。 – user1350000 2012-04-23 20:15:58