Как мне сжать этот набор данных Oracle в значения в соответствии с приоритетом строки, игнорируя нули? - PullRequest
1 голос
/ 04 ноября 2008

Я максимально упросту задачу:

У меня есть таблица оракула:

row_priority, col1, col2, col3
0, .1, 100, {null}
12, {null}, {null}, 3
24, .2, {null}, {null}

Желаемый результат:

col1, col2, col3
.2, 100, 3

Таким образом, в соответствии с приоритетом строки, он переопределяет значения предыдущих строк, если они заданы.

Я пытаюсь найти решение, используя аналитические функции над таблицей, но оно просто не ведет себя ...

Я пытаюсь:

select last_value(col1 ignore nulls) over () col1,
       last_value(col2 ignore nulls) over () col2,
       last_value(col3 ignore nulls) over () col3
from (select * from THE_TABLE order by row_priority)
where rownum = 1

или обратное:

select first_value(col1 ignore nulls) over () col1,
       first_value(col2 ignore nulls) over () col2,
       first_value(col3 ignore nulls) over () col3
from (select * from THE_TABLE order by row_priority desc)
where rownum = 1

И ни один из них не игнорирует нули. Есть намеки?

Ответы [ 3 ]

2 голосов
/ 04 ноября 2008

Вам нужно поставить rownum = 1 ВНЕ аналитического запроса

SELECT  *
FROM    (   select          last_value(col1 ignore nulls) over () col1,
                            last_value(col2 ignore nulls) over () col2,
                            last_value(col3 ignore nulls) over () col3
            from (select * from THE_TABLE ORDER BY ROW_PRIORITY)
        )
WHERE   ROWNUM = 1

, что приводит к (используя ваши значения выше):

COL1   COL2    COL3
------ ------- ----
0.2    100     3
0 голосов
/ 04 ноября 2008

Альтернатива:

SELECT
  MAX(col1) KEEP (DENSE_RANK LAST ORDER BY row_priority),
  MAX(col2) KEEP (DENSE_RANK LAST ORDER BY row_priority),
  MAX(col3) KEEP (DENSE_RANK LAST ORDER BY row_priority)
FROM the_table

Производительность может отличаться от аналитической версии; лучше это или хуже, зависит от ваших данных и среды.

0 голосов
/ 04 ноября 2008

Здесь вам может помочь функция COALESCE. Возможно, как ...

select first_value(coalesce(col1,0) ignore nulls) over () col1,
       first_value(coalesce(col2,0) ignore nulls) over () col2,
       first_value(coalesce(col3,0) ignore nulls) over () col3
from THE_TABLE
...