如何让generate_series工作一个月的一部分?

时间:2016-11-02 18:56:52

标签: sql postgresql postgresql-9.1 generate-series set-returning-functions

我正在使用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

1 个答案:

答案 0 :(得分:0)

如果我理解你的窘境,我认为你甚至不需要这里的生成系列。我想你可以在你的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时,它正确地给出了三个。

免责声明:我不明白这意味着什么:

places.id IS NULL OR restaurants.id IS NULL

如果这不起作用,那么您可以在问题中添加一些示例数据,以及一些预期结果。