SQL中循环的最有效方法?
我有两个SQL Server表:SQL中循环的最有效方法?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有两个SQL Server表: Players ( PlayerID INT, Name VARCHAR(50), Money INT ) Game ( GameID INT, PlayerID INT ) 我需要做一个查询,列出每场比赛中收入最多的球员。最好的方法是什么 我想应该是这样的逻辑: foreach(games) { playersInGame = GetPlayersInGame() return playerWithM
Players (
PlayerID INT,
Name VARCHAR(50),
Money INT
)
Game (
GameID INT,
PlayerID INT
)
我需要做一个查询,列出每场比赛中收入最多的球员。最好的方法是什么
我想应该是这样的逻辑:
foreach(games)
{
playersInGame = GetPlayersInGame()
return playerWithMostMoney from playersInGame
}
但是我在TSQL方面做得很差。使用SQL时,您希望使用
join
和groupby
操作来完成在其他语言中使用循环可以完成的工作。与这些语言相比,SQL有很多优势,特别是因为优化器可以从多种实现逻辑的方法中进行选择。例如,SQL引擎可以利用多个处理器,这在过程语言中是很困难的
在您的案例中,逻辑有两部分。第一种方法是将表连接在一起,这将为所有玩家提供一定数量的资金。第二个是找到最好的。为此,我将使用窗口函数max()
来获取最大金额(我通常会使用row\u number()
进行此操作,但我认为max()
更容易解释):
表达式max(p.money)over(按g.gameid分区)
计算每个游戏的最大金额(基于partitionby
子句)。最后一个where
子句是选择钱与最大值匹配的玩家
请注意,如果两个玩家拥有相同的最大值,他们都将被选中
row_number()
是一种选择,它总是只选择一个玩家,即使存在具有相同最大货币价值的重复玩家。类似于Gordon的答案,但使用rank
:
select gameid, playerid, money
from (select g.gameid, p.playerid, p.money,
rank() over (partition by g.gameid order by p.money desc) rn
from games g
join players p on g.playerid = p.playerid
) sq
where rn=1
学习基本的sql,特别是连接,然后只需要一个适当的
order by
子句。您几乎不需要在sql中循环<代码>分组方式聚合和联接通常是正确的方法。要学习基本sql,我听过这本书的好东西,在10分钟内自学sql。顺便说一句,欢迎使用堆栈溢出。要将文本格式化为代码块(语法突出显示),请突出显示文本,然后单击工具栏中的{}
按钮或ctl-k
“循环通过”=RBAR。RBAR!=以设定为基础。RBAR坏了,RBAR现在死了。哇,我不知道你能用超过和max
。我只在行数
和秩
中使用过它。
select gameid, playerid, money
from (select g.gameid, p.playerid, p.money,
rank() over (partition by g.gameid order by p.money desc) rn
from games g
join players p on g.playerid = p.playerid
) sq
where rn=1