如何在Postgres中进行查询以按月创建分组记录? (:created_at datetime列)

我有这个Ruby代码:

def visits_chart_data(domain) last_12_months.collect do |month| { created_at: month, count: domain.visits.created_on_month(month).count } end end def last_12_months (0..11).to_a.reverse.collect{ |month_offset| month_offset.months.ago.beginning_of_month } end 

CreatedOnMonth只是一个范围:

 scope :created_on_month, -> (month = Time.now) { where{ (created_at >= month.beginning_of_month) & (created_at <= month.end_of_month) } } 

created_at只是一个标准的日期时间戳。

如何优化它以进行一次查询而不是12?

我看到有些人使用GROUP_BY,但是我对PostgreSQL不太好,能够自己构建这样的查询。 查询应按年份对记录进行分组并返回计数。 也许有人可以帮助我。 谢谢。

如果date_trunc()每年的每个月分组,请在GROUP BY子句中使用date_trunc()函数:

 GROUP BY date_trunc('month', created_at) 

如果要在每年的每个月分组,请在GROUP BY子句中使用EXTRACT()函数:

 GROUP BY EXTRACT(MONTH FROM created_at)