给定这个伪查询:
Model.sum(:column, :condition => ['id = ?', id], order => "date DESC", :limit => X)
在这里,我们遇到的问题是,获得的总和不受值 X 的“限制”(它将列上的所有值作为总和,而不是 X(第一个)条目的总和)。
似乎limit
是在计算聚合 func 之后进行的sum
。
我怎样才能得到仅受第一个 X 条目限制的总和?
给定这个伪查询:
Model.sum(:column, :condition => ['id = ?', id], order => "date DESC", :limit => X)
在这里,我们遇到的问题是,获得的总和不受值 X 的“限制”(它将列上的所有值作为总和,而不是 X(第一个)条目的总和)。
似乎limit
是在计算聚合 func 之后进行的sum
。
我怎样才能得到仅受第一个 X 条目限制的总和?
MurifoX 的建议不起作用,因为LIMIT
仅适用于最终结果集,该结果集只有一行(总和)。看到这个线程。
解决这个问题的最简单方法是不在数据库中进行计数:
Model.where(:id => id).order('date DESC').limit(3).pluck(:column).compact.sum
这会将 的值加载column
到 Ruby 中并在那里求和。现在,如果记录集真的很大,那么效率会明显降低,因为所有这些值都被加载到应用程序的内存中。
编辑:添加.compact
- 这将在求和之前从数组中删除 nils(这会导致错误)。
在 SQL 中执行此操作的建议方法是使用子查询,如下所示:
SELECT SUM(subquery.column) FROM (
SELECT * FROM models WHERE id = 5 LIMIT 3
) AS subquery;
将其转换为 ActiveRecord 查询实际上并没有一种简单或直接的方法,因为这些查询希望从特定模型的表中进行选择。
您是否尝试以相反的方式编写查询?
My_model.where(:id => id).order('date DESC').limit(X).sum(:column)
这样,您已过滤模型以仅对缩小的值求和。