2016-04-14 57 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