2016-04-14 35 views
3

我有一个postgresql数据库,每小时耗气量条目。 现在,我需要找到每个月消费量最高的日子。Rails,ActiveRecord和SubQueries

在普通的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?性能是重中之重。

谢谢!

回答

3

你的子查询应该像重建。

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

请注意,subquery是一个ActiveRecord关系。不是实际的数据。它在第二条语句中转换为SQL,整个事情在数据库端运行。

+0

谢谢!我不知道'.from'。哪里是定义这些子查询的地方?控制器? – potofski

+0

@potofski放置它们的“最佳”在哪里进行辩论。目前的Rails做法建议尽可能减少控制器并在模型中进行工作。 – z5h

0

如果性能再高的优先考虑使用一个视图,视图可以在Active Record作为常规模型表示,你甚至可以考虑使用物化视图,并定期更新记录,这样你就不会需要计算所有的每一次。

添加视图查看scenic gem和物化视图的迁移过程的一部分。

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

从子查询的查询,而不是一个表,你用from