Group by month+year with counts

戏子无情 提交于 2020-01-14 13:28:07

问题


I have a table of Albums that has a date column named release_date.

I want to get a list of all the month + year combinations present along with the number of albums released in that month/year.

So, the output might be something like:

  • November 2016 - 11
  • October 2016 - 4
  • July 2016 - 19
  • December 2015 - 2

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


回答1:


I'm assuming your table is singular Album per Rails convention. If not, consider changing it.

 Album.all.map { |album| [Date::MONTHNAMES[album.date.month], album.date.year].join(' ') }
  .each_with_object(Hash.new(0)) { |month_year, counts| counts[month_year] += 1 }

Explanation:

The .map method iterates over the albums and returns an array of strings consisting of ["month year", "month year", ... ].

The .each_with_object method is a standard counting algorithm that returns a hash with a count for each unique array item.




回答2:


Database layer is where this task belongs, not Ruby:

Album.group("TO_CHAR(release_date, 'Month YYYY')").count

Why using database layer? Simply because it is lightning fast compared to nearly anything else, it is resource-efficient especially compared to Ruby, it scales perfectly and because having tons of Album records you can simply overload memory and never actually finish the processing.



来源:https://stackoverflow.com/questions/40538996/group-by-monthyear-with-counts

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!