Получение последующих данных

Определяет записи результирующей выборки данных, находящиеся после текущей записи выборки данных.

Спецификация
   
< смещение >::=
целое положительное число
< стандартное значение >::=
Синтаксические правила
  1. < Выражение > может быть столбцом или выражением.

  2. Если < смещение > не задано, по умолчанию используется 1.

  3. < Значимые выражения > в < OVER-спецификации > задают столбцы выборки, по которым выполняется разбивка выборки на интервалы агрегирования.

  4. < Имена столбцов > в < ORDER BY-спецификации > задают имена ранжируемых столбцов.

Общие правила
  1. Функция предоставляет доступ к записям, находящимся на заданном < смещении > от текущей записи интервала агрегирования, к которому применена функция (см. подраздел «OVER-спецификация»).

  2. Если значение < выражения > с учетом < смещения > выходит за пределы раздела данных, возвращается < стандартное значение >.

Примеры
  1. select MAKE, Lead(MAKE, 2, 'Нет данных') as MAKE_Lead
      from AUTO where personid <  5;
     MAKE             MAKE_LEAD
     ----             ---------
    |FORD            | AMERICAN MOTORS |
    |ALPINE          | MASERATI        |
    |AMERICAN MOTORS | Нет данных      |
    |MASERATI        | Нет данных      | 
  2. Пример реальной задачи.

    Пусть есть таблица, в которой хранятся идентификаторы водителей автобусов (person_id), названия населённых пунктов (location_name) и время прохождения автобусом этого населённого пункта (date_time).

    Пусть, для примера, эта таблица выглядит следующим образом:

    create or replace table person_location_time (person_id int, location_name varchar(1), date_time date);
    insert into person_location_time values (1,'A',to_date('1/1/2008 10:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (1,'A',to_date('1/1/2008 12:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (1,'B',to_date('1/1/2008 14:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (1,'A',to_date('1/1/2008 16:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (1,'A',to_date('1/5/2008 21:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (1,'B',to_date('1/6/2008 14:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (1,'A',to_date('1/7/2008 14:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (1,'A',to_date('1/8/2008 14:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (2,'A',to_date('1/1/2008 10:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (2,'A',to_date('1/1/2008 12:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (2,'B',to_date('1/1/2008 14:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (2,'B',to_date('1/2/2008 16:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (2,'B',to_date('1/2/2008 17:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (2,'B',to_date('1/2/2008 18:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (2,'A',to_date('1/4/2008 16:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (2,'A',to_date('1/5/2008 21:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (2,'B',to_date('1/7/2008 19:00','MM/DD/YYYY HH:MI'));
    insert into person_location_time values (2,'A',to_date('1/8/2008 19:00','MM/DD/YYYY HH:MI'));
    

    Необходимо получить информацию о том, сколько времени назад водитель проезжал через этот же пункт (т.е. соблюдение водителем графика движения):

    select x.*,divtime(8,prior_date_time,date_time) lag_hours
      from (select person_location_time.*, lag(date_time)
                   over (partition by person_id,location_name order by date_time) prior_date_time, lead(date_time)
                   over (partition by person_id,location_name order by date_time) next_date_time 
              from person_location_time) x
     order by date_time;

    Результат:

    PERSON_ID LOCATION_NAME DATE_TIME  PRIOR_DATE_TIME NEXT_DATE_TIME    LAG_HOURS
    
    |1|A|01.01.2008:10:00:00.00|                      |01.01.2008:12:00:00.00| |
    |2|A|01.01.2008:10:00:00.00|                      |01.01.2008:12:00:00.00| |
    |1|A|01.01.2008:12:00:00.00|01.01.2008:10:00:00.00|01.01.2008:16:00:00.00|2|
    |2|A|01.01.2008:12:00:00.00|01.01.2008:10:00:00.00|04.01.2008:16:00:00.00|2|
    |1|B|01.01.2008:14:00:00.00|                      |06.01.2008:14:00:00.00| |
    |2|B|01.01.2008:14:00:00.00|                      |02.01.2008:16:00:00.00| |
    |1|A|01.01.2008:16:00:00.00|01.01.2008:12:00:00.00|05.01.2008:21:00:00.00|4|
    …

    Запрос также (для наглядности) выдаёт для каждой записи текущее время (DATE_TIME), время предыдущего нахождения того же самого водителя в том же населённом пункте (PRIOR_DATE_TIME) и время следующего нахождения того же самого водителя в том же населённом пункте (NEXT_DATE_TIME).