Теперь познакомимся с некоторыми наиболее важными аналитическими функциями Oracle.
С помощью функции row_number мы нумеруем строки в наборе, сгруппированном по name и отсортированном по dt.
Функции max over и count over находят максимальное значение поля и количество строк в каждой группе одинаковых name.
Два варианта функции sum over находят соответственно общую сумму и сумму с нарастающим итогом по всей группе одинаковых namе.
С помощью экспоненты и логарифма можно посчитать не сумму, а произведение зарплат во всей группе одинаковых namе.
select name,
dt,
wage,
row_number() over(order by name, dt) row_number_total,
row_number() over(partition by name order by dt) row_number_for_this_name,
max(wage) over(partition by name) maximal_wage_for_this_name,
count(1) over(partition by name) count_rows_for_this_name,
sum(wage) over(partition by name) total_sum_for_this_name,
sum(wage) over(partition by name order by dt) cumulative_sum_for_this_name,
exp(sum(ln(wage)) over(partition by name)) wage_multiplicat_for_this_name
from kk_salary
order by name, dt;
Функции lag и lead позволяют взять предыдущие и следующие значения поля в отсортированном наборе:
select name,
dt,
lag(wage, 2) over(partition by name order by dt) previous_previous_wage,
lag(wage) over(partition by name order by dt) previous_wage,
wage,
lead(wage) over(partition by name order by dt) next_wage,
lead(wage, 2) over(partition by name order by dt) next_next_wage
from kk_salary
order by name, dt;