2012-04-23 139 views
3

比方說,我有一個這樣的表: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

回答

1

根據什麼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 
2

我想你在找什麼可以在這裏找到:

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/

會告訴你如何實現一個計數器,可以給你一個排名。

3

這是老式的(閱讀:基本的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

2

在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 
相關問題