- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我一直在努力寻找正确的 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/
我有两个列表,我想从 neg 中减去列表 pos 中元素的频率。所以: neg = [x for x in all[:800000]] pos = [x for x in all[800000:]]
我有两个列表,我想从 neg 中减去列表 pos 中元素的频率。所以: neg = [x for x in all[:800000]] pos = [x for x in all[800000:]]
我正在尝试减去 2 个标准逻辑向量并得到错误 p2 <= p1(11 downto 0)- idata(11 downto 0); Error (10327): VHDL error at sub.v
我将以下代码嵌入到类中。每当我运行 distToPoint 时,它都会给出错误“不支持的操作数类型 -: 'NoneType' 和 'float'” 我不知道为什么它会返回 NoneType 和如何让
这一直让我想知道, 假设我有这种情况: select (...long sub query..) - (...long sub query..) 我想把 - 放在条件中,这意味着有时它会是 - 有时是
我有两个 vector 。我需要从 vector1 中删除 vector2 中的内容。 [编辑:不清楚这是否意味着按照下面的链接或设置差异进行逐元素减法] 我使用 Visual Studio 2010
我有一张这样的 table : id product_property_id product_id amount type 1 1 145 10
我有两个 boolean 值列表 buy_machine 和 broken_machine。我想创建第三个列表 working_machines,它是购买的机器数量的总和并减去坏机器的数量。 我尝试了
我似乎可以解决这个问题。我有两个来自 sql 的访问者/国家/地区列表 us,us,uk,fr,uk,uk,uk 和 us,uk 我用 array_count_values() 将它们制成数组: Ar
我在 javascript 中减去时间时遇到了麻烦,尽管我已经谷歌搜索了 2 天但没有任何运气:( 我正在尝试为调查问卷计时。当用户开始调查问卷时,会记录时间戳。当用户完成/单击提交时,会记录新的时间
我正在尝试对 flex 搜索中索引的字段进行一些分析。 其中两个字段是“start_time”和“end_time”。我基本上希望将这两个字段的差异分组,即('end_time'-'start_tim
我有一个函数,它接收两个 BigDecimal 数字,即 bd1 和 bd2 作为参数。该函数应减去 bd1 - db2 并返回 bd1 和 bd2 的小数位数均为 2,结果的小数位数也应仅为 2但使
根据ldt_code中的ld源代码here。没有将dl_main传递给phdr的上下文,我对为什么通过减去虚拟地址来推断main_map的加载地址有些困惑。 我跟踪过的代码: 1124 static
我进行了多次重复测量的治疗,我想减去每次治疗的每个时间点的对照值。数据集的形状是这样的,有多年、物种和处理。 ID Year Species Treatment value 1 2010 x
我正在尝试查找一次旅行的矩形区域,可以在此处找到更多上下文 我在下面的代码中遇到的错误是: "Exception in thread "main" java.lang.ArrayIndexOutOfB
我一直在尝试使用 pandas dataframe 减去我读入 python 的列之间的日期和时间。我写的代码如下: Time = df['t'] - df['t'].shift(1) + df['t
I want to subtract all values in a[nn,...,0] by b[nn] while keeping the original structure of the ar
假设我有两个列表:List l1,和 Listl2 请帮助我如何在 2 个列表之间合并、减去和相交。谢谢。 注意:我使用的是 .NET 2.0,所以我不能使用 LINQ。谢谢。 最佳答案 以下是伪代码
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我正在尝试运行以下代码: extern crate unicase; use unicase::UniCase; use std::collections::HashSet; fn main() {
我是一名优秀的程序员,十分优秀!