Различия между двумя аналитическими запросами - PullRequest
1 голос
/ 04 августа 2009

Каковы различия между следующими двумя запросами? Оба возвращают разные строки:

with ordered_table as 
(
select * from table order by column1
)
select first_value(column2 ignore nulls) over (partition by column3)
from ordered_table;

и

select first_value(column2 ignore nulls) over (partition by column3 order by column1)
from table;

Примечание: я постараюсь предоставить контрольный пример, но я думаю, что для кого-то, у которого есть ясные понятия, нет необходимости.

Ответы [ 3 ]

0 голосов
/ 04 августа 2009

Первая версия упорядочивает всю строку, заданную column1, затем разбивает ее на column3 и выполняет аналитический расчет. Обратите внимание, что первоначальное упорядочение по столбцу 1 не обязательно сохраняется посредством разбиения - что, я думаю, является тем, что вас, вероятно, вешает.

Вторая версия разделяет данные по столбцу 3, затем сортирует в каждом разделе по столбцу 1, а затем определяет аналитический вывод.

0 голосов
/ 04 августа 2009
WITH ordered_table AS
        (
        SELECT  *
        FROM    table
        ORDER BY
                column1
        )
SELECT  FIRST_VALUE(column2 IGNORE NULLS) OVER (PARTITION BY column3)
FROM    ordered_table

Этот запрос вернет первое значение для каждой секции column2 в произвольном порядке (т. Е. CBO может свободно выбирать любой порядок, который он считает наилучшим).

SELECT  FIRST_VALUE(column2 IGNORE NULLS) OVER (PARTITION BY column3 ORDER BY column1)
FROM    table;

Этот запрос вернет первое значение для каждого раздела column2, а разделы упорядочены по column1.

Поскольку язык SQL работает с наборами, а ваше предложение ORDER BY ничего не делает с набором, возвращенным в CTE, Oracle просто игнорирует часть ORDER BY.

CBO может выбрать материализацию, хеширование или любой другой способ искажения CTE перед его использованием внешним запросом, поэтому ORDER BY, используемый в CTE, будет потерян для внешнего запроса.

0 голосов
/ 04 августа 2009

Упорядочение по столбцу1 ничего не делает в первом запросе.

Это создает результирующий набор по порядку, но я не думаю, что это влечет за собой утверждение вашего раздела. Порядок принадлежит условному разделу раздела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...