У меня есть таблица, которая содержит историю затрат по местоположению. Они обновляются ежемесячно.
Например
Location1, $500, 01-JAN-2009
Location1, $650, 01-FEB-2009
Location1, $2000, 01-APR-2009
если я сделаю запрос на 1 марта, я хочу вернуть значение на 1 февраля, поскольку 1 марта не существует.
Я написал запрос с использованием аналитики оракула, но это занимает слишком много времени (было бы хорошо для отчета, но мы используем его, чтобы позволить пользователю визуально просматривать данные через передний план и и переключать даты, запрашивая данные слишком долго, если в таблице примерно 1 миллион строк).
Итак, следующая мысль, которая у меня была, - просто обновить таблицу с отсутствующими данными. В приведенном выше случае я просто добавил бы запись, идентичную 01-ФЕВ-2009, за исключением того, что установил дату 01-MAR-2009.
Мне было интересно, если у всех вас были мысли о том, как лучше всего это сделать.
Мой план состоял в том, чтобы просто создать курсор для местоположения, извлечь первую запись, затем извлечь следующую, а если следующей записи не было в следующем месяце, вставить запись для отсутствующего месяца.
Немного больше информации:
CREATE TABLE MAXIMO.FCIHIST_BY_MONTH
(
LOCATION VARCHAR2(8 BYTE),
PARKALPHA VARCHAR2(4 BYTE),
LO2 VARCHAR2(6 BYTE),
FLO3 VARCHAR2(1 BYTE),
REGION VARCHAR2(4 BYTE),
AVG_DEFCOST NUMBER,
AVG_CRV NUMBER,
FCIDATE DATE
)
И затем запрос, который я использую (система передаст дату и паркальфа). Таблица содержит около 1 миллиона строк, и, опять же, хотя отчету требуется разумное количество времени, для интерактивного отображения требуется слишком много времени
select location, avg_defcost, avg_crv, fcimonth, fciyear,fcidate from
(select location, avg_defcost, avg_crv, fcimonth, fciyear, fcidate,
max(fcidate) over (partition by location) my_max_date
from FCIHIST_BY_MONTH
where fcidate <='01-DEC-2008'
and parkalpha='SAAN'
)
where fcidate=my_max_date;