Определите окно и используйте его в нескольких аналитических столбцах
У меня есть оракульный запрос, в котором мне нужно использовать несколько аналитических функций в одном окне. Как я могу определить окно один раз, а затем использовать его для каждого из этих вызовов?
Т.е. я хочу написать это как в PostGRESql:
SELECT
sum(salary) OVER w,
avg(salary) OVER w
FROM empsalary
WINDOW w AS (PARTITION BY depname ORDER BY salary DESC);
Забыл упомянуть, цель - избежать дублирования кода, а не ускорить запрос.
1 ответ
Oracle не поддерживает этот синтаксис. Просто укажите окно в каждом аналитическом утверждении:
SELECT
sum(salary) OVER (PARTITION BY depname ORDER BY salary DESC),
avg(salary) OVER (PARTITION BY depname ORDER BY salary DESC)
FROM empsalary;
Если вы посмотрите на план объяснения для запроса, то должен быть только один WINDOW (SORT)
Операция, как Oracle знает, чтобы повторно использовать окно для обоих операторов.
Начиная с версии 20c, Oracle поддерживает синтаксис оконных предложений.
Расширенные аналитические функции
Предложение query_block оператора SELECT теперь поддерживает предложение window_clause, которое реализует предложение window стандартного табличного выражения SQL, как определено в стандарте SQL:2011.
Так что ваш запрос будет отлично работать без изменений:
SELECT
sum(salary) OVER w,
avg(salary) OVER w
FROM empsalary
WINDOW w AS (PARTITION BY depname ORDER BY salary DESC);