比方說,我有一個這樣的表: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
非常感謝任何指針。
比方說,我有一個這樣的表: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