To state the answer to @mu_is_too_short, you can do this with the generate_seriesfollowing:
SELECT dt.series, COUNT(u.created_at)
FROM users u
RIGHT OUTER JOIN (
SELECT
GENERATE_SERIES( (NOW() - INTERVAL '30 day')::date, NOW()::date, '1 day')::date
AS series
) AS dt
on DATE_TRUNC('month', u.created_at) = dt.series
GROUP BY dt.series
ORDER BY dt.series DESC
What gives:
series | count
------------+-------
2014-01-08 | 0
2014-01-07 | 0
2014-01-06 | 0
2014-01-05 | 0
2014-01-04 | 0
2014-01-03 | 0
2014-01-02 | 0
2014-01-01 | 1
2013-12-31 | 0
At the same time, the ActiveRecord syntax for this is pretty ugly, it's best to write it in pure SQL above and just get the original results. Sort of:
sql = <<-SQL
SELECT dt.series, COUNT(u.created_at)
FROM users u
RIGHT OUTER JOIN (
SELECT
GENERATE_SERIES( (NOW() - INTERVAL '30 day')::date, NOW()::date, '1 day')::date
AS series
) AS dt
on DATE_TRUNC('month', u.created_at) = dt.series
GROUP BY dt.series
ORDER BY dt.series DESC
SQL
records = User.connection.select_all(sql)
records.each do |record|
puts record['series']
end
<<-SQL , , .