Обратите внимание на использование GENERATE_DATE_ARRAY
и RIGHT JOIN
для получения желаемых результатов:
WITH data AS (
SELECT *
FROM UNNEST ([
STRUCT(DATE("2014-12-03") AS d, 4 AS a)
, STRUCT("2015-01-05", 7)
, STRUCT("2015-03-05", 1)
])
), all_months AS (
SELECT month
FROM UNNEST(GENERATE_DATE_ARRAY(
(SELECT DATE_TRUNC(MIN(d), MONTH) FROM data)
, (SELECT MAX(d) FROM data)
, INTERVAL 1 MONTH)
) AS month
)
SELECT month, IFNULL(SUM(a),0) a, SUM(SUM(a)) OVER(ORDER BY month) a_cum
FROM data
RIGHT JOIN all_months
ON DATE_TRUNC(d, MONTH)=month
GROUP BY month
ORDER BY month
Теперь, если мы простосчитая, вы можете использовать тот факт, что LEFT / RIGHT JOIN будет иметь нулевые значения для пустых месяцев.Вот как запрос может быть адаптирован к произвольной таблице (здесь Википедия):
WITH data AS (
SELECT *, DATE(datehour) d
FROM `fh-bigquery.wikipedia_v3.pageviews_2018`
WHERE wiki='pt'
AND (datehour BETWEEN '2018-09-30' AND '2018-09-30'
OR datehour BETWEEN '2018-12-01' AND '2018-12-02'
)
AND title LIKE 'Calif%'
), all_months AS (
SELECT month
FROM UNNEST(GENERATE_DATE_ARRAY(
(SELECT DATE_TRUNC(MIN(d), MONTH) FROM data)
, (SELECT MAX(d) FROM data)
, INTERVAL 1 MONTH)
) AS month
)
SELECT month, COUNT(d) c, SUM(COUNT(d)) OVER(ORDER BY month) a_cum
FROM data
RIGHT JOIN all_months
ON DATE_TRUNC(d, MONTH)=month
GROUP BY month
ORDER BY month