我使用filled_months来填充空白月份并按月分组数据。问题是我似乎不能让它用于查询部分月份(例如2016-09-01到2016-09-15),它总是计算整个月份。有人能给我指个正确的方向吗?
with filled_months AS
(SELECT
month,
0 AS blank_count
FROM generate_series(date_trunc('month',date('2016-09-01')), date_trunc('month',date('2016-09-15')), '1 month') AS
month)
SELECT to_char(mnth.month, 'YYYY Mon') AS month_year,
count(distinct places.id)
FROM filled_months mnth
left outer join restaurants
ON date_trunc('month', restaurants.created_at) = mnth.month
left outer join places
ON restaurants.places_id = places.id
WHERE places.id IS NULL OR restaurants.id IS NULL
GROUP BY mnth.month
ORDER BY mnth.month
如果我正确理解了您的困惑,我认为您甚至不需要这里的generate系列。我认为您可以在where子句中使用between
,并让SQL中的分组处理其余部分:
SELECT
to_char(r.created_at, 'YYYY Mon') AS month,
count(distinct p.id)
FROM
restaurants r
left join places p ON r.places_id = p.id
WHERE
r.created_at between '2016-09-01' and '2016-09-15'
GROUP BY month
ORDER BY month
我在日期为9/1/16、9/15/16和9/30/16的三条记录上进行了测试,结果显示计数为2。当我将范围扩大到9/30时,它正确地给出了3。
免责声明:我不明白这是什么意思:
places.id IS NULL OR restaurants.id IS NULL
如果这不起作用,那么也许您可以在您的问题中添加一些示例数据,以及一些预期的结果。