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 

非常感谢任何指针。

+0

可否请你参加编写问题一段时间吗?它应该至少包含[您尝试过的]的清晰描述(http://mattgemmell.com/2008/12/08/what-have-you-tried/)。 – Ben 2012-04-23 20:03:07

+2

您使用的是什么RDBMS和版本? – Lamak 2012-04-23 20:05:36

+0

我目前使用的是OpenOffice.org Base 3.3,但最终会在mySQL 5上实现此功能。 – user1350000 2012-04-23 20:15:58

根据什么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

+0

谢谢,非常有帮助。 – 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