Mysql SQL查询以返回一列被另一列“分组”的三个最高值
假设我有一张这样的桌子:Mysql SQL查询以返回一列被另一列“分组”的三个最高值,mysql,sql,Mysql,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 非常感谢您的
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
非常感谢您的指点。根据您使用的数据库管理系统,您可能能够以某种形式使用行号 在SQLServer2008中,您可以使用
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
我想你要找的东西可以在这里找到: 基本上,最佳解决方案使用秩函数。以下是该站点的示例代码:
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的信息,您将需要对上面使用Microsoft SQL的查询进行一些修改。您需要用自己的RANK实现替换RANK函数。没那么难。完整的说明可在此处找到:
这将向您展示如何实现一个计数器,该计数器可以为您提供一个排名编号。这是一种老式的read:basic 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
这两个版本在关系的表示方式上有所不同——第一个版本根据group by的性质返回一行,并且需要连接回原始表以显示所有记录,第二个版本直接从原始表工作,同时显示所有数据和关系
您可以在SQL server中找到。:
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
你能花点时间写下你的问题吗?它至少应该包含一个清晰的描述。您使用的是什么RDBMS和版本?我现在使用的是OpenOffice.org Base 3.3,但最终将在mySQL 5上实现它。谢谢,确实非常有用。
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