1

我有这个 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 不太擅长,无法自己构建这样的查询。查询应按一年中的月份对记录进行分组并返回计数。也许有人可以帮助我。谢谢。

4

1 回答 1

8

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

GROUP BY date_trunc('month', created_at)

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

GROUP BY EXTRACT(MONTH FROM created_at)
于 2014-05-20T10:59:17.157 回答