Друзья, есть таблица вида:
WITH t AS (SELECT 100 par, 1 key_id, 'x' val FROM dual
UNION ALL
SELECT 200 par, 1 key_id, null val FROM dual
UNION ALL
SELECT 300 par, 1 key_id, null val FROM dual
UNION ALL
SELECT 100 par, 2 key_id, null val FROM dual
UNION ALL
SELECT 200 par, 2 key_id, 'y' val FROM dual
UNION ALL
SELECT 300 par, 2 key_id, null val FROM dual
union all
SELECT 100 par, 3 key_id, null val FROM dual
UNION ALL
SELECT 200 par, 3 key_id, null val FROM dual
UNION ALL
SELECT 300 par, 3 key_id, 'z' val FROM dual)
select t.par,t.key_id,t.val FROM t
Нужно ее как-то привести к виду:
WITH t AS (SELECT 100 par, 1 key_id, 'x' val FROM dual
UNION ALL
SELECT 200 par, 1 key_id, null val FROM dual
UNION ALL
SELECT 300 par, 1 key_id, null val FROM dual
UNION ALL
SELECT 100 par, 2 key_id, 'x' val FROM dual
UNION ALL
SELECT 200 par, 2 key_id, 'y' val FROM dual
UNION ALL
SELECT 300 par, 2 key_id, null val FROM dual
union all
SELECT 100 par, 3 key_id, 'x' val FROM dual
UNION ALL
SELECT 200 par, 3 key_id, 'y' val FROM dual
UNION ALL
SELECT 300 par, 3 key_id, 'z' val FROM dual)
select t.par,t.key_id,t.val FROM t
Или словами:
строки с key_id=1 остаются без изменений, в строках с key_id=2 появляется изменение- строка где par=100 and key_id=2 записывается 'x' из первой строчки. И аналогично в строках с key_id=3 тоже изменения- строки где (par=100 or par=200) and key_id=3 получают значение из предыдущих строк.
Мне видится такая логика:
WITH t AS (SELECT 100 par, 1 key_id, 'x' val FROM dual
UNION ALL
SELECT 200 par, 1 key_id, null val FROM dual
UNION ALL
SELECT 300 par, 1 key_id, null val FROM dual
UNION ALL
SELECT 100 par, 2 key_id, null val FROM dual
UNION ALL
SELECT 200 par, 2 key_id, 'y' val FROM dual
UNION ALL
SELECT 300 par, 2 key_id, null val FROM dual
union all
SELECT 100 par, 3 key_id, null val FROM dual
UNION ALL
SELECT 200 par, 3 key_id, null val FROM dual
UNION ALL
SELECT 300 par, 3 key_id, 'z' val FROM dual)
select t.par,t.key_id,t.val FROM t
join
(select par,max(key_id) as m from t where val is not null group by par) mx on mx.par=t.par and mx.m<=t.key_id;
но что-то ни черта не работает
Заранее спасибо