Мне нужно создать материализованную таблицу запросов с записями, у которых есть атрибут, полученный с помощью подзапроса во второй таблице, чтобы получить самое последнее значение этого атрибута. Этот вопрос очень похож на тот, который обсуждается здесь: Получение последней записи в каждой группе за исключением следующего:
- внутренний подзапрос должен сравнивать дату действия второй таблицы с current_date (или CURDATE), а не с другим полем даты из основной таблицы
- результаты используются для создания новой материализованной таблицы запроса
При этих предположениях SQL завершается ненормально, выдавая ошибку SQ20058, которую можно устранить двумя способами:
- используя конкретную дату вместо current_date, что делает этот оператор бесполезным для моих целей
добавление
disable query optimization
к текущим настройкам в конце инструкции
data initially deferred refresh deferred maintained by user
что, в свою очередь, отключает оптимизацию запросов в операционной системе iSeries V7R1.
Чтобы решить эту проблему, я попытался создать представление со всеми записями, извлеченными внутренним подзапросом, затем выпустить оператор создания таблицы, присоединяющийся к представлению, чтобы избежать выполнения подзапроса, но снова материализованная таблица запроса не может адресовать представление, которое содержит ссылки на текущую дату.
Вы знаете, как я могу сравнить записи с текущей датой при создании таблиц? Что мне не хватает?
Спасибо
Пример: 1) данная таблица продаж определена как:
create table sales (
item_id decimal(3, 0),
sale_date date,
sale_qty decimal(7, 2)
)
со следующим содержанием:
ITEM_ID SALE_DATE SALE_QTY
1 2016-01-10 10,00
1 2016-02-10 10,00
1 2016-03-10 10,00
2 2016-01-10 5,00
2 2016-02-10 5,00
2 2016-03-10 5,00
2) и представляет собой таблицу, определенную как:
create table depts (
item_id decimal(3, 0),
dept_from_date date,
dept_id character(3)
)
со следующим содержанием:
ITEM_ID DEPT_FROM_DATE DEPT_ID
1 2016-01-01 AAA
1 2016-03-01 BBB
2 2016-01-01 BBB
2 2016-02-01 CCC
2 2016-05-01 DDD
2 2016-12-01 EEE
3) это ожидаемый результат:
select s.item_id, s.sale_date, s.sale_qty, d.dept_id
from sales s
left join depts d on d.item_id=s.item_id
and d.dept_from_date = (
select max(dept_from_date)
from depts x
where x.item_id = d.item_id and dept_from_date <= current_date)
ITEM_ID SALE_DATE SALE_QTY DEPT_ID
1 2016-01-10 10,00 BBB
1 2016-02-10 10,00 BBB
1 2016-03-10 10,00 BBB
2 2016-01-10 5,00 DDD
2 2016-02-10 5,00 DDD
2 2016-03-10 5,00 DDD
где идентификатор отдела сводится к самому последнему значению для целей бизнес-аналитики.
4) когда предыдущий оператор выбора встроен в оператор создания таблицы следующим образом:
create table sales2 as (
select s.item_id, s.sale_date, s.sale_qty, d.dept_id
from sales s
left join depts d on d.item_id=s.item_id
and d.dept_from_date = (
select max(dept_from_date)
from depts x
where x.item_id = d.item_id and dept_from_date <= current_date))
data initially deferred
refresh deferred
maintained by user
он возвращает ошибку SQ20058.