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
, будет потерян для внешнего запроса.