Перевести диапазоны дат в последовательности дат в BigQuery - PullRequest
1 голос
/ 07 февраля 2020

У меня есть table 1, который выглядит следующим образом:

+-----------+------------+------------+
| campaign  | start_date |  end_date  |
+-----------+------------+------------+
| campaign1 | 2020-01-01 | 2020-01-03 |
| campaign2 | 2020-01-04 | 2020-01-06 |
| ...       | ...        | ...        |
+-----------+------------+------------+

Я хотел бы создать table 2, который выглядит следующим образом:

+-----------+------------+
| campaign  |    date    |
+-----------+------------+
| campaign1 | 2020-01-01 |
| campaign1 | 2020-01-02 |
| campaign1 | 2020-01-03 |
| campaign2 | 2020-01-04 |
| campaign2 | 2020-01-05 |
| campaign2 | 2020-01-06 |
| ...       | ...        |
+-----------+------------+

Имейте в виду, что table 1 будет иметь n количество строк и будет добавляться на регулярной основе. Я хотел бы запланировать создание table 2, используя запланированный запрос.

Я играл с GENERATE_DATE_ARRAY() в сочетании с CROSS JOIN UNNEST. Я не смог найти способ сделать это элегантно. Есть предложения?

Ответы [ 3 ]

2 голосов
/ 07 февраля 2020

[Как] Перевести диапазоны дат в последовательности дат ...

Ниже приведен стандарт BigQuery SQL

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'campaign1' campaign, DATE '2020-01-01' start_date, DATE '2020-01-03' end_date UNION ALL
  SELECT 'campaign2', '2020-01-04', '2020-01-06' 
)
SELECT campaign, day
FROM `project.dataset.table`,
UNNEST(GENERATE_DATE_ARRAY(start_date, end_date)) day
-- ORDER BY campaign, day

с результатом

Row campaign    day  
1   campaign1   2020-01-01   
2   campaign1   2020-01-02   
3   campaign1   2020-01-03   
4   campaign2   2020-01-04   
5   campaign2   2020-01-05   
6   campaign2   2020-01-06   

Обновление - используйте ниже в вашем реальном случае использования (выше был только пример с фиктивными данными из вашего вопроса для тестирования)

#standardSQL
SELECT campaign, day
FROM `project.dataset.table`,
UNNEST(GENERATE_DATE_ARRAY(start_date, end_date)) day
0 голосов
/ 07 февраля 2020

Еще один подход заключается в создании «календарного» CTE (или таблицы в вашей базе данных), а затем перекрестного объединения и фильтрации:

with cal as ( select dte from unnest(generate_date_array('2000-01-01','2050-01-01', interval 1 day)) dte),
tbl as (
  select 'campaign1' as campaign, cast('2020-01-01' as date) as start_date, cast('2020-01-03' as date) as end_date union all
  select 'campaign2','2020-01-04','2020-01-06'
)
select campaign, dte from tbl
cross join cal
where dte between start_date and end_date
order by campaign, dte
0 голосов
/ 07 февраля 2020

Вы можете использовать generate_date_array() и unnest():

select campaign, dte
from (select 'campaign1' as campaign,  date('2020-01-01') as start_date, date('2020-01-03') as end_date
     ) t cross join
     unnest(generate_date_array(t.start_date, t.end_date, interval 1 day)) dte;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...