Я использую Vertica, что, к сожалению, не позволяет мне использовать CROSS APPLY. И, очевидно, в Vertica нет такой вещи, как CTE.
Вот что у меня есть:
t:
day | id | metric | d_metric
-----------+----+--------+----------
2011-12-01 | 1 | 10 | 10
2011-12-03 | 1 | 12 | 2
2011-12-04 | 1 | 15 | 3
Обратите внимание, что в первый день дельта равна значению метрики.
Я хотел бы заполнить пробелы, как это:
t_fill:
day | id | metric | d_metric
-----------+----+--------+----------
2011-12-01 | 1 | 10 | 10
2011-12-02 | 1 | 10 | 0 -- a delta of 0
2011-12-03 | 1 | 12 | 2
2011-12-04 | 1 | 15 | 3
Я думал о том, как сделать это изо дня в день, но мне бы очень хотелось, чтобы решение работало за один раз.
Я думаю, что мог бы получить что-то, работающее с LAST_VALUE, но я не могу придумать правильные операторы JOIN, которые позволили бы мне правильно разделять и упорядочивать ежедневную историю каждого идентификатора.
редактирование:
предположим, у меня есть такая таблица:
calendar:
day
------------
2011-01-01
2011-01-02
...
, который может быть связан с объединениями. Мое намерение состояло бы в том, чтобы поддерживать диапазон дат в calendar , чтобы соответствовать диапазону дат в t .
редактирование:
Еще несколько заметок о том, что я ищу, просто чтобы быть конкретным:
При генерации t_fill я бы хотел точно охватить диапазон дат в t , а также любые даты, которые отсутствуют между ними. Таким образом, правильный t_fill начнется в ту же дату и закончится в ту же дату, что и t .
t_fill имеет два свойства:
1) как только идентификатор появляется на какой-то дате, у него всегда будет строка для каждой последующей даты. Это заполнение пробела, подразумеваемое в первоначальном вопросе.
2) Если никакая строка для идентификатора не появится снова после некоторой даты, решение t_fill должно весело генерировать строки с таким же значением метрики (и 0 дельта) от даты, когда эти последние данные указывают вверх до даты окончания т .
Решение может заполнить более ранние даты до начала диапазона дат в t . То есть для любого идентификатора, который появляется после первой даты в t , строки между первой датой в t и первой датой для идентификатора будут заполнены метрикой = 0 и d_metric = 0. Я не предпочитаю подобное решение, поскольку оно имеет более высокий фактор роста для каждого идентификатора, который входит в систему. Но я мог бы легко справиться с этим, выбрав в новую таблицу только те строки, где метрика! = 0 и d_metric! = 0.