我有一个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
但是,我不知道在rails中执行此操作的最佳方式(或任何方式)。我很感激任何意见。我应该绕过ActiveRecord吗?绩效是一个高度优先事项。
谢谢!
答案 0 :(得分:3)
您的子查询应该使用以下内容重新创建:
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端运行。
答案 1 :(得分:0)
如果性能是高优先级然后考虑使用View,视图可以在Active Record中表示为常规模型,您甚至可以考虑使用物化视图并定期更新记录,这样您就不需要每次计算一切。
有关在迁移过程中添加视图和物化视图的信息,请参阅scenic gem。