Как получить непрерывную дату в Presto с датой начала в одном столбце и датой окончания в другом столбце

Ниже показано, как таблица Raw выглядит в предварительной версии.

Таблица ввода

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

Ниже показано, как будет выглядеть пример таблицы

Выходная таблица


person Rpunk21    schedule 30.06.2020    source источник
comment
Вы используете Hive или Presto? Они не то же самое.   -  person Gordon Linoff    schedule 30.06.2020


Ответы (1)


Это проблема пробелов и островов. Самый простой способ — вычесть последовательность, чтобы получить постоянную дату, а затем агрегировать:

select id, min(datefield), max(datefield)
from (select t.*, row_number() over (partition by id order by datefield) as seqnum
      from t
     ) t
group by id, (datefield - seqnum * interval '1 day');

Функции окна различаются в зависимости от базы данных. Логика та же, но синтаксис вычитания seqnum дней из datefield может отличаться.

person Gordon Linoff    schedule 30.06.2020
comment
Не могли бы вы помочь мне понять, почему вы используете (datefield - seqnum * interval '1 day') в группе и помочь с примером того, как он рассчитывается - person Rpunk21; 01.07.2020
comment
@rpunk21 . . . Запустите код select t.*, (datefield - seqnum * interval '1 day') from t order by id, datefield, и вы сможете убедиться в этом сами. - person Gordon Linoff; 01.07.2020