Объединить по дате и группе и заполнить пропущенные даты в большом запросе - PullRequest
0 голосов
/ 08 января 2020

У меня есть таблица с ID, датой начала и даты окончания.

ID  start_date  end_date
1   01/01/2014  06/01/2014
2   10/01/2005  12/01/2015
3   08/01/2009  10/01/2012
...

У меня есть другая таблица с каждым событием по ID с датой (усеченной до месяца).

ID  month_year   amount
1   02/01/2014   100
1   03/01/2007   25
2   010/01/2010  50
...

Я хочу иметь возможность получить итоговую месячную сумму по ID с добавлением нулевых месяцев.

ID  month_year   amount
1   02/01/2007   100
1   03/01/2007   0
2   04/01/2007   0
...

Извинения, если это базовый c вопрос. Это очень близко к этому вопросу и к этому вопросу , но из-за размера набора данных важно заполнять нули только для каждого идентификатора между start_date и end_date. Это также похоже на введите описание ссылки здесь , но я не могу перевести это в большой запрос. Мой код сейчас выключен, но что-то вроде:

WITH data AS(
            SELECT * FROM `Table 11` AS t0
), all_months AS (
   SELECT month
   FROM UNNEST(GENERATE_DATE_ARRAY(
     (SELECT MIN(start_date) FROM data)
     , (SELECT MAX(end_date) FROM data)
     , INTERVAL 1 MONTH)
   ) AS month
)

SELECT DISTINCT ID month_year, 
    SUM(Amount) OVER (PARTITION BY ID, month_year) AS sum_amount,   
FROM data AS t0
LEFT JOIN all_months AS t1
ON t0.month_year=t1.month

1 Ответ

2 голосов
/ 08 января 2020

Ниже приведен пример для BigQuery Standard SQL

#standardSQL
WITH `project.dataset.data` AS (
  SELECT 1 id, '01/01/2014' start_date, '06/01/2014' end_date UNION ALL
  SELECT 2, '10/01/2005', '12/01/2015' UNION ALL
  SELECT 3, '08/01/2009', '10/01/2012' 
), `project.dataset.amounts` AS (
  SELECT 1 id, '02/01/2014' month_year, 100 amount UNION ALL
  SELECT 1, '03/01/2007', 25 UNION ALL
  SELECT 2, '10/01/2010', 50 
), all_months AS (
  SELECT id, FORMAT_DATE('%m/%d/%Y', month_year) month_year
  FROM `project.dataset.data`,
  UNNEST(GENERATE_DATE_ARRAY(PARSE_DATE('%m/%d/%Y', start_date), PARSE_DATE('%m/%d/%Y', end_date), INTERVAL 1 MONTH)) month_year
)
SELECT id, month_year, SUM(IFNULL(amount, 0)) amount
FROM all_months m
LEFT JOIN `project.dataset.amounts` a
USING (id, month_year)
GROUP BY id, month_year   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...