Давайте разберем аналитические функции.
Для начала, тезисно пару слов о самих аналитических функциях:Процесс выполнения запроса в Оракле, содержащий аналитические функции выполняется в 3 этапа
- Выполняются все соединения(JOIN),условия содержащиеся в WHERE,GROUP BY и HAVIG
- Теперь для результирующего множества доступны аналитические функции, на котором они собственно и выполняются
- Если запрос содержит сортировку, то выполнятся условия из ORDER BY
Давайте более подробно разберем 2-ой этап, а именно работу аналитических функций.
Эти функции дают разработчику разбить результат запроса на подгруппы, которые называются партициями.Обращаю внимание на то что эти партиции не имею ни какого отношения к партициям которые создаются для таблиц на "Физическом" уровне.
Партиции формируются после выполнения группировок GROUP BY, по-этому для них доступны такие агрегатные функции,как сумма или среднее.
Для каждой партиции, разработчик может определить "скользящее окно данных"(Window).
Эти окна необходимы для определения массива строк по которым будет вычисляется значение в текущей строке.
Окно может содержать все строки партиции, или какую то одну или несколько строк в партиции, которые определяются логическими условиями. Следует помнить о том что когда производятся вычисления в "оконных функциях" результирующая строка тоже учитывается.
Перед началом разбора на примерах самих аналитических функций давай определим нашу тестовую предметную область.
Пускай у нас есть таблица anl_incom_lpm, которые содержит данные о неких участниках, которые зарегистрировавшийся в определенном магазине и получили некие дисконтные карты, которые им дают возможность получать скидки в магазинах розничной сети.
и так приведем структуру нашей таблицы
CREATE TABLE anl_incom_lpm (
member_row_id varchar2(15), -- уникальный идентификатор участника
member_reg_store varchar2(4), -- идентификатор точки регистрации (торговой точки)
member_created date, -- дата регистрации
points_count number -- количество "скидочных" баллов на карточке
)
Наконец перейдем к описанию самих аналитических функций