Исходная таблица:
id | s_date | summ |
1 | 01.12.2010 | 10000 |
2 | 01.12.2010 | 7000 |
3 | 01.12.2010 | 6000 |
4 | 01.12.2010 | 1000 |
5 | 01.12.2010 | 2000 |
6 | 02.12.2010 | 4000 |
7 | 02.12.2010 | 5000 |
8 | 02.12.2010 | 1500 |
LEAD.
Аналитическая функция которая позволяет получать значение последующей записи.
Синтаксис: LEAD (field1, offset, default) OVER (partition by, order by)
где:
field1 - обязательный параметр, название поля;
offset - не обязательный, величина смещения, по умолчании равно единице;
default - не обязательный, значение по умолчанию, null;
partition by - не обязательный, разделение;
order by - обязательный, сортировка.
select id, s_date, summ, lead(summ) over (order by id) lead from salesРезультат:
id | s_date | summ | lead |
1 | 01.12.2010 | 10000 | 7000 |
2 | 01.12.2010 | 7000 | 6000 |
3 | 01.12.2010 | 6000 | 1000 |
4 | 01.12.2010 | 1000 | 2000 |
5 | 01.12.2010 | 2000 | 4000 |
6 | 02.12.2010 | 4000 | 5000 |
7 | 02.12.2010 | 5000 | 1500 |
8 | 02.12.2010 | 1500 |
С разделением по дате:
select id, s_date, summ, lead(summ) over (partition by s_date order by id) lead from sales
id | s_date | summ | lead |
1 | 01.12.2010 | 10000 | 7000 |
2 | 01.12.2010 | 7000 | 6000 |
3 | 01.12.2010 | 6000 | 1000 |
4 | 01.12.2010 | 1000 | 2000 |
5 | 01.12.2010 | 2000 | |
6 | 02.12.2010 | 4000 | 5000 |
7 | 02.12.2010 | 5000 | 1500 |
8 | 02.12.2010 | 1500 |
Видно что для последней записи (и последней записи в разделе при использовании partition by) значение null; т.к. для них нет последующего значения. Укажем параметры offset = 1 и default = 123. Тогда:
select id, s_date, summ, lead(summ, 1, 123) over (partition by s_date order by id) lead from sales
id | s_date | summ | lead |
1 | 01.12.2010 | 10000 | 7000 |
2 | 01.12.2010 | 7000 | 6000 |
3 | 01.12.2010 | 6000 | 1000 |
4 | 01.12.2010 | 1000 | 2000 |
5 | 01.12.2010 | 2000 | 123 |
6 | 02.12.2010 | 4000 | 5000 |
7 | 02.12.2010 | 5000 | 1500 |
8 | 02.12.2010 | 1500 | 123 |
Параметр offset по умолчанию равен единице. Если ему задать значение 2, будет смещение на 2 строки:
select id, s_date, summ, lead(summ, 2) over (order by id) lead from sales
id | s_date | summ | lead |
1 | 01.12.2010 | 10000 | 6000 |
2 | 01.12.2010 | 7000 | 1000 |
3 | 01.12.2010 | 6000 | 2000 |
4 | 01.12.2010 | 1000 | 4000 |
5 | 01.12.2010 | 2000 | 5000 |
6 | 02.12.2010 | 4000 | 1500 |
7 | 02.12.2010 | 5000 | |
8 | 02.12.2010 | 1500 |
LAG.
Аналитическая функция которая позволяет получать значение предыдущей записи.
Синтаксис: LAG (field1, offset, default) OVER (partition by, order by)
где:
field1 - обязательный параметр, название поля;
offset - не обязательный, величина смещения, по умолчании равно единице;
default - не обязательный, значение по умолчанию, null;
partition by - не обязательный, разделение;
order by - обязательный, сортировка.
select id, s_date, summ, lag(summ) over (order by id) lag from salesРезультат:
id | s_date | summ | lag |
1 | 01.12.2010 | 10000 | |
2 | 01.12.2010 | 7000 | 10000 |
3 | 01.12.2010 | 6000 | 7000 |
4 | 01.12.2010 | 1000 | 6000 |
5 | 01.12.2010 | 2000 | 1000 |
6 | 02.12.2010 | 4000 | 2000 |
7 | 02.12.2010 | 5000 | 4000 |
8 | 02.12.2010 | 1500 | 5000 |
Т.е. по сути функция LAG обратная функции LEAD; с аналогичным набором параметров.
При offset = 0 обе функции будут отображать значение текущей записи. Отрицательные значения функций не предусмотрены.