свертывание значений NULL в запросе Oracle

Я часто пишу запросы, в которых я поворачиваю данные и получаю значения NULL, которые я хочу свернуть. Например. данные, подобные следующим:

id  time_in     time_out
1               2009-11-01
1   2009-10-30
2   2008-12-15
2               2009-02-03

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

SELECT id,
       MIN(time_in) AS time_in,
       MIN(time_out) AS time_out
FROM (...query above...)
GROUP BY id

Это даст такие данные:

id  time_in     time_out
1   2009-10-30  2009-11-01
2   2008-12-15  2009-02-03

Проблема в том, что я использую ограниченный интерфейс для доступа к базе данных Oracle, а запросы с использованием MIN и MAX часто истекают. Мне было интересно, есть ли более эффективный способ «свернуть» значения NULL, чем то, что я сделал. Иногда я GROUP BY использую другое поле, не являющееся индексом, тогда как id, показанное выше, является первичным ключом.


person Sarah Vessels    schedule 18.11.2009    source источник


Ответы (2)


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

Другой вариант для рассмотрения (который может или не может помочь):

SELECT DISTINCT
       id,
       MAX(time_in) OVER (PARTITION BY id),
       MAX(time_out) OVER (PARTITION BY id)
FROM (...)
person Jeffrey Kemp    schedule 19.11.2009

Если ваш запрос истекает, подзапрос, вероятно, возвращает много строк, которые Oracle обычно должен сортировать, чтобы group by. Я предлагаю проверить ваш подзапрос, чтобы увидеть, можете ли вы избежать там нулей.

person Egor Rogov    schedule 19.11.2009