Получение последующих данных
Определяет записи результирующей выборки данных, находящиеся после текущей записи выборки данных.
Спецификация
::=
::=
::=
Синтаксические правила
-
< Выражение >
может быть столбцом или выражением. -
Если
< смещение >
не задано, по умолчанию используется 1. -
< Значимые выражения >
в< OVER-спецификации >
задают столбцы выборки, по которым выполняется разбивка выборки на интервалы агрегирования. -
< Имена столбцов >
в< ORDER BY-спецификации >
задают имена ранжируемых столбцов.
Общие правила
-
Функция предоставляет доступ к записям, находящимся на заданном
< смещении >
от текущей записи интервала агрегирования, к которому применена функция (см. подраздел «OVER-спецификация»). -
Если значение
< выражения >
с учетом< смещения >
выходит за пределы раздела данных, возвращается< стандартное значение >
.
Примеры
-
select MAKE, Lead(MAKE, 2, 'Нет данных') as MAKE_Lead from AUTO where personid < 5; MAKE MAKE_LEAD ---- --------- |FORD | AMERICAN MOTORS | |ALPINE | MASERATI | |AMERICAN MOTORS | Нет данных | |MASERATI | Нет данных |
-
Пример реальной задачи.
Пусть есть таблица, в которой хранятся идентификаторы водителей автобусов (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).