Заполните нулями частоту группировок дат по месяцам и годам в большом запросе
У меня есть таблица с hiredate (дата), имя (строка) и имя Sur (строка), как это:
hireDate First Name Surname
13-oct-14 Cintia Roxana Padilla Julca
28-oct-14 Conor McAteer
28-oct-14 Paolo Mesia Macher
28-oct-14 William Anthony Whelan
15-nov-14 Peter Michael Coates
13-feb-15 Natalie Conche
15-mar-15 Beatriz Vargas Huanca
01-may-15 Walter Calle Chenccnes
04-may-15 Sarah Louise Price
И я рассмотрел частоту hire_dates(DATE) и кумулятивную частоту в другом столбце, например:
Row hireDate Count Cumulative
1 13/10/2014 1 1
2 28/10/2014 3 4
3 15/11/2014 1 5
4 13/02/2015 1 6
5 15/03/2015 1 7
6 09/04/2015 1 8
7 15/04/2015 1 9
8 01/05/2015 1 10
И запрос выглядит так:
WITH
Data AS (
SELECT
hireDate,
COUNT(1) AS Count
FROM
`human-resources-221122.human_resources.employees_view`
WHERE
status <> "cancelled"
GROUP BY
1 )
SELECT
hireDate,
Count,
SUM(Count) OVER (ORDER BY hireDate ASC ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) AS Cumulative
FROM
Data
ORDER BY
hireDate ASC
Но мне нужно видеть числа по месяцам и годам с нулями в тех местах, где нет счета, что-то вроде этого:
Hire_Month Hire_Year Count Cumulative
October 2014 4 4
November 2014 1 5
December 2014 0 5
January 2015 0 5
February 2015 1 6
March 2015 1 7
April 2015 2 9
May 2015 1 10
Заранее спасибо.
1 ответ
Обратите внимание на использование 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
ht tps://stackru.com/images/cc70ee783163cff5fb7160035940c2da8a4de4cc.png
Теперь, если мы просто считаем, вы можете использовать тот факт, что в левом / правом соединении будут пустые месяцы. Вот как запрос может быть адаптирован к произвольной таблице (Wikipedia здесь):
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
ht tps://stackru.com/images/0a80320171bc4cf69d1f33f40df02ac1f747746e.png