Rails, ActiveRecord and SubQueries



我有一个postgresql数据库,其中包含每小时的天然气消耗条目。现在,我需要找到每个月消费量最高的日子。

在普通SQL中,我会使用这样的子查询:

SELECT 
    DATE_TRUNC('month', day) AS month,
    MAX(dailyconsumption) as maxconsumption
FROM (
    SELECT 
        DATE_TRUNC('day', date) AS day,
        SUM(consumption) AS dailyconsumption
    FROM Records
    GROUP BY day
) t
GROUP BY month

然而,我不知道在铁轨上做这件事的最佳方式(或任何方式)。我感谢您的意见。我应该绕过ActiveRecord吗?性能是一个高度优先事项。

谢谢!

您的子查询应该使用以下内容重新创建:

subquery = Records
  .all
  .select("DATE_TRUNC('day', date) AS day", "SUM(consumption) AS dailyconsumption")
  .group("day")

要从子查询而不是表进行查询,请使用from

Records.select(...).from(subquery)

注意,subquery是一个ActiveRecord关系。不是实际数据。它在第二条语句中被转换为SQL,整个过程在DB端运行。

如果性能是高优先级的,那么考虑使用视图,视图可以在活动记录中表示为常规模型,您甚至可以考虑使用物化视图并定期更新记录,这样您就不需要每次都计算所有内容。

请参阅风景宝石,了解如何在迁移过程中添加视图和物化视图。

最新更新