【问题标题】:Get the average of the most recent records within groups with ActiveRecord使用 ActiveRecord 获取组内最近记录的平均值
【发布时间】:2023-03-17 09:12:01
【问题描述】:

我有以下查询,它计算给定名称和联赛的所有球队的平均展示次数:

@all_team_avg = NielsenData
                  .where('name = ? and league = ?', name, league)
                  .average('impressions')
                  .to_i

但是,每个名称/联赛/团队组合可以有多个条目。我需要将查询修改为仅对 created_at 的最新记录进行平均。

this answer 的帮助下,我想出了一个查询,它得到了我需要的结果(我将在应用程序中用nameleague 替换硬编码的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


【解决方案1】:

当你只有一把锤子时,一切看起来都像钉子。

有时,原始 SQL 是最佳选择。您可以执行以下操作:

@all_team_avg = NielsenData.find_by_sql("...your_sql_statement_here...")

【讨论】:

  • 谢谢,这很好,可能是我最好的选择。我将把它打开一会儿,因为我宁愿在没有大的内联 SQL 查询的情况下这样做,但否则我会接受你的回答。
猜你喜欢
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2013-09-29
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多