Rails、ActiveRecord 和子查询
Rails, ActiveRecord and SubQueries
我有一个包含每小时 gas 消耗条目的 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 吗?性能是重中之重。
谢谢!
如果性能是高优先级,那么考虑使用视图,视图可以在活动记录中表示为常规模型,你甚至可以考虑使用物化视图并定期更新记录,这样你就不需要每次都计算所有内容。
请参阅 scenic gem 了解如何在迁移过程中添加视图和具体化视图。
您的子查询应该用类似的东西重新创建:
subquery = Records
.all
.select("DATE_TRUNC('day', date) AS day", "SUM(consumption) AS dailyconsumption")
.group("day")
要从子查询中查询,而不是 table,您可以使用 from
。
Records.select(...).from(subquery)
请注意,subquery
是一个 ActiveRecord 关系。不是实际数据。它在第二条语句中被转换为 SQL,整个事情在数据库端是 运行。
我有一个包含每小时 gas 消耗条目的 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 吗?性能是重中之重。
谢谢!
如果性能是高优先级,那么考虑使用视图,视图可以在活动记录中表示为常规模型,你甚至可以考虑使用物化视图并定期更新记录,这样你就不需要每次都计算所有内容。
请参阅 scenic gem 了解如何在迁移过程中添加视图和具体化视图。
您的子查询应该用类似的东西重新创建:
subquery = Records
.all
.select("DATE_TRUNC('day', date) AS day", "SUM(consumption) AS dailyconsumption")
.group("day")
要从子查询中查询,而不是 table,您可以使用 from
。
Records.select(...).from(subquery)
请注意,subquery
是一个 ActiveRecord 关系。不是实际数据。它在第二条语句中被转换为 SQL,整个事情在数据库端是 运行。