【发布时间】:2023-03-17 09:12:01
【问题描述】:
我有以下查询,它计算给定名称和联赛的所有球队的平均展示次数:
@all_team_avg = NielsenData
.where('name = ? and league = ?', name, league)
.average('impressions')
.to_i
但是,每个名称/联赛/团队组合可以有多个条目。我需要将查询修改为仅对 created_at 的最新记录进行平均。
在this answer 的帮助下,我想出了一个查询,它得到了我需要的结果(我将在应用程序中用name 和league 替换硬编码的WHERE 子句),但是它似乎过于复杂,我不知道如何将它很好地转换为 ActiveRecord:
SELECT avg(sub.impressions)
FROM (
WITH summary AS (
SELECT n.team,
n.name,
n.league,
n.impressions,
n.created_at,
ROW_NUMBER() OVER(PARTITION BY n.team
ORDER BY n.created_at DESC) AS rowcount
FROM nielsen_data n
WHERE n.name = 'Social Media - Twitter Followers'
AND n.league = 'National Football League'
)
SELECT s.*
FROM summary s
WHERE s.rowcount = 1) sub;
如何使用 ActiveRecord 重写此查询或以更简单的方式获得相同的结果?
【问题讨论】:
-
您希望它以纯 SQL 方式解决,还是可以接受混合解决方案。一些操作可以在 ruby 端完成。
-
任何可以完成的事情对我来说都很好,但性能是一个考虑因素。因此,例如,我宁愿避免做一些事情,比如拉入整个表并在内存中处理它。我对 Ruby 不是很熟悉,所以我愿意接受建议。
-
会有多少重复记录?如果只有几个,那么您可以按日期分组并稍后在 ruby 中过滤
-
目前每套只有四个。我认为它不会超过这个数字,未来可能会达到 10 或 20 个。
标签: ruby-on-rails ruby postgresql activerecord rails-activerecord