SQL-为不同类别选择最高分数
假设我有一个包含3个表的db:SQL-为不同类别选择最高分数,sql,Sql,假设我有一个包含3个表的db: 玩家(PK id_玩家,姓名…) 锦标赛(PK id_锦标赛,名称…) 游戏(PK id_回合、FK id_锦标赛、FK id_玩家和分数) 运动员参加比赛。名为“游戏”的表格记录了不同比赛中每位球员的得分) 我想创建一个如下所示的视图: torunament_name Winner highest_score Tournament_1 Jones 300 Tournament
- 玩家(PK id_玩家,姓名…)
- 锦标赛(PK id_锦标赛,名称…)
- 游戏(PK id_回合、FK id_锦标赛、FK id_玩家和分数)
torunament_name Winner highest_score
Tournament_1 Jones 300
Tournament_2 White 250
我尝试了不同的方法,但我对sql还是相当陌生的(也不熟悉这个论坛)
我尝试使用union all子句,如:
select * from (select "Id_player", avg("score") as "Score" from
"Game" where "Id_tournament" = '1' group by "Id_player" order by
"Score" desc) where rownum <= 1
union all
select * from (select "Id_player", avg("score") as "Score" from
"Game" where "Id_tournament" = '2' group by "Id_player" order by
"Score" desc) where rownum <= 1;
最终编辑:
好的,如果有人怀疑我使用了豪尔赫·坎波斯的脚本,对它做了一点修改,它就工作了。谢谢大家的帮助。不幸的是,我还不能更新评论,所以我只能通过发帖来感谢。这是最后的剧本:
select
t.name,
p.name as winner,
g.score
from
game g inner join tournaments t
on g.id_tournament = t.id_tournament
inner join players p
on g.id_player = p.id_player
inner join
(select g.id_tournament, g.id_player,
row_number() over (partition by t.name order by
score desc) as rd from game g join tournaments t on
g.id_tournament = t.id_tournament
) a
on g.id_player = a.id_player
and g.id_tournament = a.id_tournament
and a.rd=1
order by t.name, g.score desc;
假设您想要的是“在每项比赛中显示每位球员的高分”
在MS Sql server中,您的查询如下所示
select
t.name as tournament_name,
p.name as Winner,
Max(g.score) as [Highest_Score]
from Tournmanents t
Inner join Game g on t.id_tournament=g.id_tournament
inner join Players p on p.id_player=g.id_player
group by
g.id_tournament,
g.id_player,
t.name,
p.name
根据您使用的RDBMs,可以简化此查询
select
t.name,
p.name as winner,
g.score
from
game g inner join tournaments t
on g.id_tournament = t.id_tournament
inner join players p
on g.id_player = p.id_player
inner join
(select id_tournament,
id_player,
row_number() over (partition by t.name order by score desc) as rd
from game
) a
on g.id_player = a.id_player
and g.id_tournament = a.id_tournament
and a.rd=1
order by t.name, g.score desc
如果这对你有用,请检查这个
SELECT tournemntData.id_tournament ,
tournemntData.name ,
dbo.Players.name ,
tournemntData.Score
FROM dbo.Game
INNER JOIN ( SELECT dbo.Tournaments.id_tournament ,
dbo.Tournaments.name ,
MAX(dbo.Game.score) AS Score
FROM dbo.Game
INNER JOIN dbo.Tournaments ONTournaments.id_tournament = Game.id_tournament
INNER JOIN dbo.Players ON Players.id_player = Game.id_player
GROUP BY dbo.Tournaments.id_tournament ,
dbo.Tournaments.name
) tournemntData ON tournemntData.id_tournament =Game.id_tournament
INNER JOIN dbo.Players ON Players.id_player = Game.id_player
WHERE tournemntData.Score = dbo.Game.score
你的RDBMs是什么?如果一场比赛有多场比赛怎么办?您的查询不包括这种情况。无论是哪场比赛,对于每一场比赛,我的查询都会为每位球员提供最高分数。这就是问题的框架。你不明白我的意思,如果你有一个t1(作为锦标赛1),有两个游戏作为g1和g2,并且玩家a,你的查询将为同一个锦标赛两次获取玩家a。我知道OP并没有明确说明这一点,我只是认为最好是每个球员都有一场比赛,以达到他想要的结果。不要说你的问题是错误的。在这种情况下,您必须汇总t1的所有结果,而不是显示它的所有结果。我并没有按游戏id分组。所以我的查询会为玩家玩的每个单独的锦标赛抽取每个玩家的最大(分数)。我也明白你的意思。谢谢你的回答。我想我没有把所有的东西都放在我的第一篇文章里。所以让我们假设id为1的玩家在锦标赛a中得了50分,玩家2得了40分,玩家1获胜,因此表中应该只显示玩家1为本次锦标赛的赢家(如果可能的话,则显示2名或更多的玩家,如果是平手)。下一行显示第二届锦标赛的获胜者。我不认为我会在同一场比赛中为一名球员安排多场比赛,但如果我愿意,我可能会从他的所有得分中计算平均得分。你能帮忙吗?你的数据库系统是什么?Mysql、sqlserver、oracle、postgresql?oracle。我将在Application Express中使用此选项来显示基于此select语句的简单报告。我已更改了答案。“ORA-00923:FROM关键字未找到预期位置”我正在检查它在Oracle SqlDeveloper中是否有效我编辑了我的第一篇文章,以便向您提供更多信息
SELECT tournemntData.id_tournament ,
tournemntData.name ,
dbo.Players.name ,
tournemntData.Score
FROM dbo.Game
INNER JOIN ( SELECT dbo.Tournaments.id_tournament ,
dbo.Tournaments.name ,
MAX(dbo.Game.score) AS Score
FROM dbo.Game
INNER JOIN dbo.Tournaments ONTournaments.id_tournament = Game.id_tournament
INNER JOIN dbo.Players ON Players.id_player = Game.id_player
GROUP BY dbo.Tournaments.id_tournament ,
dbo.Tournaments.name
) tournemntData ON tournemntData.id_tournament =Game.id_tournament
INNER JOIN dbo.Players ON Players.id_player = Game.id_player
WHERE tournemntData.Score = dbo.Game.score