2010-01-20 7 views
-1

http://pastebin.com/m24c4f508Oracle SQL для копирования строк через вниз ниже, первенствует как справиться

--Чувствуют помощи будет оценен

+0

Вы должны предоставить столбец для сортировки, так что один знает, что «предыдущая» строка. Кроме того, вы должны задать свой вопрос здесь, используя некоторые примеры данных. Определение 'INSERT' и детального вывода в пастебине велико, как только вопрос будет ясен. –

+0

Кроме того, ваши ВСТАВКИ полностью перепутаны. –

+0

спасибо за информирование, исправленные инструкции вставки и заказы – soField

ответ

0

Если вы просто хотите, чтобы получить статус из предыдущей строки, если она NULL, используйте LAG:

SELECT 
    rn, 
    device_num, 
    COALESCE(status_01, LAG(status_01) OVER (ORDER BY pri_id)) status_01, 
    COALESCE(status_02, LAG(status_02) OVER (ORDER BY pri_id)) status_02 
FROM tt1 
ORDER BY pri_id 

Ваш пример берет его из последней строки, где она была установлена, так что вам, возможно, нужно сделать что-то вроде этого:

SELECT 
    rn, 
    device_num, 
    COALESCE(status_01, (SELECT MAX(status_01) KEEP(DENSE_RANK LAST ORDER BY pri_id) 
         FROM tt1 tt1_1 
         WHERE tt1_1.id < tt1.id 
         AND tt1_1.status_01 IS NOT NULL)) status_01, 
    COALESCE(status_02, (SELECT MAX(status_02) KEEP(DENSE_RANK LAST ORDER BY pri_id) 
         FROM tt1 tt1_2 
         WHERE tt1_2.id < tt1.id 
         AND tt1_2.status_02 IS NOT NULL)) status_02 
FROM tt1 
ORDER BY pri_id 
+0

спасибо, второй из них идеально подходит для меня – soField

0

Если я понимаю, что вы хотите сделать правильно (если нет значения для статуса, использовать одну из предыдущей строки), вы должны посмотреть в использовании LAG и привести в сочетании с NVL/COALESCE