gpt4 book ai didi

ruby-on-rails - Active Record 减去两个具有不同 where 语句的值?

转载 作者:数据小太阳 更新时间:2023-10-29 08:59:59 26 4
gpt4 key购买 nike

我一直在努力寻找正确的 rails 方法来做到这一点。我有两个表,一个是与 dailystats 表具有一对多关系的玩家。每天都会记录新的统计数据。我试图只获取那个月的最高统计数据,但统计数据是整体记录的。所以今天的统计数据是所有月份的总和。所以我需要把当前月份从上个月的最后一天减去。

我使用以下方法获取当天的最高统计数据。

@gamesplayed = Player.joins(:dailystats).select('players.*, dailystats.gamesplayed AS average_score').order('average_score desc').group('players.id').where('MONTH(statdate) = MONTH(NOW())').first.name

那么我将如何从本月 - 上个月的差异中为顶级玩家做这件事?我假设它看起来像这样,

@gamesplayed = (Player.joins(:dailystats).select('players.*, dailystats.gamesplayed AS average_score').where('(MONTH(statdate) = MONTH(NOW()))') -  Player.joins(:dailystats).select('players.*, dailystats.gamesplayed AS average_score').where('(MONTH(statdate) = MONTH(NOW() - INTERVAL 1 MONTH)')).first.name

最佳答案

您可以运行两个查询,就像您建议的解决方案一样,但是 - 运算符绝对不够智能,无法处理计算每个查询的行差异。您必须编写自己的代码来遍历每个“本月”行,找到相应的“上个月”行,并存储差异。

但您也可以在一个查询中执行此操作。在 Rails 的查询语法中这样做会变得很复杂,因为我们在这里进入相对高级的 SQL,但我会尽力而为。

Player
.joins("JOIN (SELECT player_id,
SUM(gamesplayed) as gamesplayed, COUNT(*) as count
FROM dailystats
WHERE DATE_TRUNC('MONTH', statdate) = DATE_TRUNC('MONTH', NOW())
GROUP BY player_id) this_month
ON this_month.player_id = players.id
")
.joins("JOIN (SELECT player_id,
SUM(gamesplayed) as gamesplayed, COUNT(*) as count
FROM dailystats
WHERE DATE_TRUNC('MONTH', statdate) =
DATE_TRUNC('MONTH', NOW() - INTERVAL '1 month')
GROUP BY player_id) last_month
ON last_month.player_id = players.id
")
.select('players.*')
.select('this_month.gamesplayed - last_month.gamesplayed AS gamesplayed_change')

(您可能注意到我将您的 MONTH() 用法更改为 DATE_TRUNC('month');原因是 MONTH 将返回 1、2、3、 4 等,这意味着如果您的网站运行时间超过一年,您将开始不恰本地返回去年的数据。)

上面的工作方式是两次连接到 dailystats 表;一次用于本月的统计数据,一次用于上个月的统计数据。然而,由于每个玩家都有多个 dailystats 条目,我们首先通过子查询对每个月的统计数据进行分组,这样我们就希望每行中只有一行连接到每个玩家。然后,我们的 SELECT 子句可以使用我们上面计算的每月统计数据来获得合理的差异。

现在,上面的代码太长了,不能放到你的代码库中。要清理它,您可能需要创建一个 monthlystats 汇总表(可以在您的数据库中实现为一个 View ),或者将您的代码转换为使用原始 SQL(提取到一个单独的模块)。

附言上面的代码未经测试,因此可能包含一两个错误。如果它不起作用,请评论,我会帮助解决。

关于ruby-on-rails - Active Record 减去两个具有不同 where 语句的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38063058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com