как выбрать ненулевые значения из Oracle (оптимизированный метод)

как я могу выбрать ненулевые значения из таблицы...

позволяет таблицу изображений следующим образом:

master_id |     date_update     | name  |  dpt  | channel | source | active
---------------------------------------------------------------------------
    1     |   1/2/2015 15:43:21 | NULL  |  NULL |  NULL   |   NULL |    y
    1     |   1/2/2015 15:43:21 | NULL  |  FIN  |  NULL   |   NULL |    n
    1     |   1/2/2015 15:40:16 | Elvis |  NULL |  NULL   |   NULL |    n
    1     |   1/2/2015 15:26:38 | NULL  |  NULL |  CH1    |   NULL |    n
    1     |   1/2/2015 14:57:02 | NULL  |  NULL |  NULL   |    S1  |    n
    5     |   2/2/2015 15:28:02 | NULL  |  NULL |  CH2    |   NULL |    y
    5     |   1/2/2015 10:13:01 | Sarah |  NULL |  NULL   |   NULL |    n

Результат, который я хотел бы получить, это:

master_id |     date_update     | name  |  dpt  | channel | source | active
---------------------------------------------------------------------------
    1     |   1/2/2015 15:43:21 | Elvis |  FIN  |  CH1    |   S1   |    y 
    5     |   2/2/2015 15:28:02 | Sarah |  NULL |  CH2    |   NULL |    y

Вы можете заметить, что столбец DATE_UPDATE и ACTIVE является последним...

Какой метод самый оптимизированный? Я попробовал комбинацию listagg (чтобы объединить строки в одну), а затем получить последнюю информацию с помощью row_number() over() или max() over() но я не уверен, что это лучшее решение для повышения производительности... соединения также не лучшее решение (потому что мне нужно объединить 17 столбцов)..


person Mr.P    schedule 02.02.2016    source источник
comment
Можем ли мы предположить, что для данного столбца и группы master_id данные будут разреженными по отношению к значениям NULL, а это означает, что в этом столбце будет только одно значение, отличное от NULL? Кроме того, всегда ли вы выбираете последнюю date_update для каждой master_id группы?   -  person Tim Biegeleisen    schedule 02.02.2016


Ответы (1)


Агрегатная функция Oracle MAX() должна игнорировать значения NULL, то есть она должна выбирать значение, отличное от NULL, в каждой группе master_id как "максимальное" для этого столбца/группы.

SELECT master_id, MAX(date_update), MAX(name), MAX(dpt), MAX(channel), MAX(source),
    MAX(active)
FROM image
GROUP BY master_id
person Tim Biegeleisen    schedule 02.02.2016
comment
вот о чем я думал :) а какова производительность? - person Mr.P; 02.02.2016
comment
Я думаю, что структура таблицы может быть более серьезной проблемой, чем производительность запроса. Ваша таблица разреженная, что означает, что в ней много неиспользуемого пространства. Планируете ли вы часто запускать этот запрос в рабочей среде? - person Tim Biegeleisen; 02.02.2016
comment
Я понимаю, что вы имеете в виду... проблема в некорректном поведении приложения :( Пытаюсь исправить этот баг тем запросом, который будет служить data_mart для отчётности... знаете, этакая консолидация данных... - person Mr.P; 02.02.2016