Определите окно и используйте его в нескольких аналитических столбцах

У меня есть оракульный запрос, в котором мне нужно использовать несколько аналитических функций в одном окне. Как я могу определить окно один раз, а затем использовать его для каждого из этих вызовов?

Т.е. я хочу написать это как в 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);
Другие вопросы по тегам