среда, 14 сентября 2011 г.

Функции LEAD и LAG

Получение последующего и предыдущего значения.

Исходная таблица:
ids_datesumm
101.12.201010000
201.12.20107000
301.12.20106000
401.12.20101000
501.12.20102000
602.12.20104000
702.12.20105000
802.12.20101500


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
Результат:
ids_datesummlead
101.12.2010100007000
201.12.201070006000
301.12.201060001000
401.12.201010002000
501.12.201020004000
602.12.201040005000
702.12.201050001500
802.12.20101500


С разделением по дате:
select id, s_date, summ, lead(summ) over (partition by s_date order by id) lead from sales
ids_datesummlead
101.12.2010100007000
201.12.201070006000
301.12.201060001000
401.12.201010002000
501.12.20102000
602.12.201040005000
702.12.201050001500
802.12.20101500


Видно что для последней записи (и последней записи в разделе при использовании 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
ids_datesummlead
101.12.2010100007000
201.12.201070006000
301.12.201060001000
401.12.201010002000
501.12.20102000123
602.12.201040005000
702.12.201050001500
802.12.20101500123


Параметр offset по умолчанию равен единице. Если ему задать значение 2, будет смещение на 2 строки:
select id, s_date, summ, lead(summ, 2) over (order by id) lead from sales
ids_datesummlead
101.12.2010100006000
201.12.201070001000
301.12.201060002000
401.12.201010004000
501.12.201020005000
602.12.201040001500
702.12.20105000
802.12.20101500



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
Результат:
ids_datesummlag
101.12.201010000
201.12.2010700010000
301.12.201060007000
401.12.201010006000
501.12.201020001000
602.12.201040002000
702.12.201050004000
802.12.201015005000


Т.е. по сути функция LAG обратная функции LEAD; с аналогичным набором параметров.
При offset = 0 обе функции будут отображать значение текущей записи. Отрицательные значения функций не предусмотрены.