4

给定这个伪查询:

Model.sum(:column, :condition => ['id = ?', id], order => "date DESC", :limit => X)

在这里,我们遇到的问题是,获得的总和不受值 X 的“限制”(它将列上的所有值作为总和,而不是 X(第一个)条目的总和)。

似乎limit是在计算聚合 func 之后进行的sum

我怎样才能得到仅受第一个 X 条目限制的总和?

4

2 回答 2

10

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 查询实际上并没有一种简单或直接的方法,因为这些查询希望从特定模型的表中进行选择。

于 2013-03-18T15:06:02.917 回答
1

您是否尝试以相反的方式编写查询?

My_model.where(:id => id).order('date DESC').limit(X).sum(:column)

这样,您已过滤模型以仅对缩小的值求和。

于 2013-03-18T11:47:38.927 回答