Доступные версии документации

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

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

Спецификация
   
<смещение>::=
целое положительное число
<стандартное значение>::=
Синтаксические правила
  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).

Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter