如何获得轨道查询中每个组的最后第n条记录

问题描述:

我有一个名为Game的表格,它在nhl季节中充满了来自所有游戏的单个玩家statlines。我在这里关注的领域是本赛季球员第n场比赛的games_played。 和名字是玩家的名字。如何获得轨道查询中每个组的最后第n条记录

本质上我想弄清楚如何抓住每个球员的第nth最后一场比赛。

例如我知道下面的查询可以得到我的最后一场比赛对每个球员

Game.group(:name).having('games_played = MAX(games_played)') 

然而,当我尝试以下方法(可以说,n为10)

Game.group(:name).having('games_played=MAX(games_played)-10') 

我没有得到任何结果

而且事实上如果我明确地做了类似于

Game.group(:name).having('games_played=16') 

我只得到玩过16场比赛的球员的最后一场比赛,而不是所有球员的第16场比赛。 (我猜这解释了以前的查询没有结果)

我该如何去获得每个玩家的最后一场比赛?

这是甚至正确的方式来查询此?我也有一个玩家表,玩家拥有多个游戏,一个游戏属于一个玩家。我应该利用这一点吗?

+0

你能解释一下**第n个最后一个**吗? – Pavan

+0

你有没有考虑过'take'功能?例如。将'.take(n).last'添加到查询的末尾? –

+0

@Pavan,最后一位我指的是在最近一场比赛之前的n-1场比赛。所以倒数第二次是最近的第二场比赛,倒数第10次是最近的第10场比赛。我想为每个不同的玩家获得该游戏。 – user3692508

要找到特定玩家的第n个最后一场比赛,最简单的方法是找到玩家。

player = Player.find_by(name: "user3692508") 

,那么你可以找到与玩家游戏:通过games_played

player.games 

要获得的第n个最后一场比赛,你可以责令其按降序排列,然后将其限制在一个结果,并抵消它你想要的偏移量:

player.games.order(games_played: :desc).limit(1).offset(0) 

如果你做了一个0的偏移量,你会得到最后一场比赛。如果你的偏移量为1,你将获得最后一场比赛,等等。

这是假设您的播放器has_many :games和游戏belongs_to :player

通过使用子查询,你可以得到每个球员的第n个最后一场比赛。(它看起来像一个烂摊子.....)

offset = 1 

sub_query = "SELECT 'sub_game'.id FROM 'games' as sub_game WHERE 'sub_game'.'player_id' = games.player_id ORDER BY 'sub_game'.'games_played' DESC LIMIT 1 OFFSET #{offset}" 

Game.joins(:player).where("games.id IN (#{sub_query})").order(id: :desc).group(:player_id) 

使用此解决方案,您可以为子查询中的每个玩家排序游戏,并首先在那里进行偏移。

+0

谢谢,这非常有帮助。 是否有可能有一个查询返回每个玩家的最后一场比赛,还是应该为每个玩家设置一个查询? – user3692508

+0

要获得每个玩家的最后一场比赛,您可以执行'Game.joins(:player).order(games_played :: desc).group(:player_id)',但不知道如何为其添加偏移量。 –

+0

我为我的答案添加了一个解决方案,它将为您提供每位玩家的最后一场比赛 –