【问题标题】:Group by decade with counts按十年分组
【发布时间】:2016-11-14 14:54:46
【问题描述】:

我有一个 Album 的表,其中有一个名为 release_datedate 列。

我想获取所有十年的列表以及该十年中发行的专辑数量。

所以,输出可能是这样的:

  • 2010 - 11
  • 2000 - 4
  • 1990 - 19
  • 1940 - 2

Ruby 2.3.1 w/ Rails 5 on Postgres 9.6,FWIW。

这基本上是我之前的一个问题的后续问题:Group by month+year with counts

这可能对解决方案有所帮助...我只是不确定如何按十年分组。

【问题讨论】:

  • 我想知道您是否检查了我为这个问题提供的解决方案以及to this question

标签: ruby-on-rails ruby postgresql


【解决方案1】:

使用 Ruby 处理 db 数据在所有方面都是低效的。

我建议在数据库级别进行:

Album.group("(DATE_PART('year', release_date)::int / 10) * 10").count

这里发生的情况,基本上是您将release_date 中的一年部分转换为整数,然后计算该组的十年并计算专辑。

说,我们有一个release_date"2016-11-13T08:30:03+02:00"

2016 / 10 * 10
#=> 2010

【讨论】:

    【解决方案2】:

    是的,这与您之前的问题非常相似。在这种情况下,您不需要创建月/年组合并将组合用作分组标准,而是需要一种从专辑年份返回十年基准年的方法。

    既然你有一个模式开发,考虑编写代码以便它可以被重用。

    def album_decades
      Album.all.map { |album| album.release_date.year / 10 * 10 }
    end
    
    def count_each(array)
      array.each_with_object(Hash.new(0)) { |element, counts| counts[element] += 1 }
    end
    

    现在您可以致电count_each(album_decades) 获取您想要的结果。看看你是否可以编写一个方法album_months_and_years,通过调用count_each(album_months_and_years),它会从你之前的问题中产生你想要的结果。

    【讨论】:

      【解决方案3】:

      您的问题有不止一种可能的解决方案,但我会尝试:

      1. Album 表中添加一个名为decade 的新列。您可以对这只海豚使用迁移。
      2. 在将 Album 保存到 DB 之前,创建一个回调(它类似于触发器,但在程序员方面)设置 decade 值。
      3. 最后,您可以使用此useful queryAlbums 按十年分组。在您的情况下,Album.group(:decade).count 会给您一个哈希值,其中包含 Albums 的数字(以十年为单位)。
      4. ...
      5. 利润?

      除了笑话,回调应该是这样的:

      class Album < ActiveRecord::Base
          # some code ...
      
          before_save  :set_decade    # this is the 'callback'
      
          # ...
      
          private
              def set_decade
                  self.decade = self.release_date.year / 10
              end
      

      然后,如果您使用第 3 步,它将返回如下内容:

      # => { '195' => 7, '200' => 12 }
      

      我没有测试答案,所以试试看,告诉我结果如何。

      【讨论】:

      • 我会避免在数据库中保留冗余数据。
      • 在实践中,如果您知道自己在做什么,就不会真正关心冗余数据。有时您会避免使用“规则”来制定更清晰的解决方案和/或节省使用常规 SQL 查询的时间。我可以从一位专家(一位老系统设计师/分析师:我的老师)的经验告诉你。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      相关资源
      最近更新 更多