Добавить строки между двумя датами Presto - PullRequest
0 голосов
/ 21 января 2019

У меня есть таблица, которая имеет 3 столбца - начало, конец и emp_num.Я хочу создать новую таблицу, в которой есть все даты между этими датами для каждого сотрудника.Необходимо использовать Presto.

Я ссылался на эту ссылку - вставка дат в таблицу между начальной и конечной датой в Presto

Попытка с использованием функции unnest путем создания последовательности, но,Я не знаю, как создать последовательность, извлекая даты из двух столбцов в другой таблице.

select unnest(seq) as t(days)
from (select sequence(start, end, interval '1' day) as seq 
      from table1)

Вот таблица и ожидаемый формат

Table 1:
start       |  end         | emp_num 
2018/01/01  |   2018/01/05 | 1
2019/02/01  |   2019/02/05 | 2


Expected:
start          | emp_num 
2018/01/01     | 1
2018/01/02     | 1
2018/01/03     | 1
2018/01/04     | 1
2018/01/05     | 1
2019/02/01     | 2
2019/01/02     | 2
2019/02/03     | 2
2019/02/04     | 2
2019/02/05     | 2

1 Ответ

0 голосов
/ 22 января 2019

Вот запрос, который может выполнить работу для вашего варианта использования.

Логика заключается в использовании функции Presto sequence() для генерации широкого диапазона дат (с 2000 по конец 2018 года вы можете адаптировать его по мере необходимости), который можно объединить с таблицей для сгенерировать вывод.

select dt.x, emp_num
from 
    ( select x from unnest(sequence(date '2000-01-01', date '2018-01-31')) t(x) ) dt
    inner join table1 ta on dt.x >= ta.start and dt.x <= ta.end

Однако, как прокомментировал JNevill, было бы более эффективно создавать таблицу календаря, а не генерировать ее на лету при каждом выполнении запроса.

Это должно быть просто как:

create table calendar as
    select x from unnest(sequence(date '1970-01-01', date '2099-01-01')) t(x);

И тогда ваш запрос станет:

select dt.x, emp_num
from 
    calendar dt
    inner join table1 ta on dt.x >= ta.start and dt.x <= ta.end

PS: из-за отсутствия DB Fiddles для Presto в дикой природе я не смог протестировать запросы (@PiotrFindeisen - если вы прочитаете это - было бы неплохо иметь скрипку Presto!).

...