Функкция lag
возвращает значение из строки с указанным сдвигом, которое предшествует текущему значению строки.
Данные автоматически разделены (partition by) по экземплярам процесса, строки заранее отсортированы по дате начала (started), потом по признаку сортировки (sorting) и потом по дате окончания (ended).
Значения NULL пропускаются, возвращается следующее не-NULL значение.
lag( колонка|выражение [, сдвиг] )
- колонка или выражение — имя столбца из таблицы event, по которому будет работать функция. Также можно написать выражение с более сложной логикой агрегации.
- сдвиг — количество значений, предшествующих текущей строке в указанном столбце. Если не указано, то берется значение по умолчанию — 1.
Запрос:
select
process.extId as "Экз. процесса",
event.name as "Шаг",
lag(event.name) as "Предыдущий шаг",
eventNum() as num
from event, process
order by "Экз. процесса", num
Данные на входе:
Данные на выходе:
extId |
name |
1 |
register request |
1 |
examine thoroughly |
1 |
check ticket |
1 |
decide |
1 |
reject request |
2 |
register request |
2 |
examine casually |
2 |
check ticket |
2 |
decide |
2 |
reinitiate request |
2 |
examine thoroughly |
2 |
check ticket |
2 |
pay compensation |
Экз. процесса |
Шаг |
Предыдущий шаг |
num |
1 |
register request |
|
1 |
1 |
examine thoroughly |
register request |
2 |
1 |
check ticket |
examine thoroughly |
3 |
1 |
decide |
check ticket |
4 |
1 |
reject request |
decide |
5 |
2 |
register request |
|
1 |
2 |
examine casually |
register request |
2 |
2 |
check ticket |
examine casually |
3 |
2 |
decide |
check ticket |
4 |
2 |
reinitiate request |
decide |
5 |
2 |
examine thoroughly |
reinitiate request |
6 |
2 |
check ticket |
examine thoroughly |
7 |
2 |
pay compensation |
check ticket |
8 |
Запрос:
select
process.extId as "Экз. процесса",
event.name as "Шаг",
lag(event.name,2) as "Предыдущий шаг",
eventNum() as num
from event, process
order by "Экз. процесса", num
Данные на входе:
Данные на выходе:
extId |
name |
1 |
register request |
1 |
examine thoroughly |
1 |
check ticket |
1 |
decide |
1 |
reject request |
2 |
register request |
2 |
examine casually |
2 |
check ticket |
2 |
decide |
2 |
reinitiate request |
2 |
examine thoroughly |
2 |
check ticket |
2 |
pay compensation |
Экз. процесса |
Шаг |
Предыдущий шаг |
num |
1 |
register request |
|
1 |
1 |
examine thoroughly |
|
2 |
1 |
check ticket |
register request |
3 |
1 |
decide |
examine thoroughly |
4 |
1 |
reject request |
check ticket |
5 |
2 |
register request |
|
1 |
2 |
examine casually |
|
2 |
2 |
check ticket |
register request |
3 |
2 |
decide |
examine casually |
4 |
2 |
reinitiate request |
check ticket |
5 |
2 |
examine thoroughly |
decide |
6 |
2 |
check ticket |
reinitiate request |
7 |
2 |
pay compensation |
examine thoroughly |
8 |
Запрос:
select
name as "Событие",
lag(event.name) as "Предыдущее событие",
count(*) as "Кол-во переходов"
from event
group by "Событие", "Предыдущее событие"
order by "Кол-во переходов" desc
Данные на входе:
Данные на выходе:
extId |
name |
1 |
register request |
1 |
check ticket |
1 |
examine casually |
1 |
decide |
1 |
reinitiate request |
1 |
check ticket |
1 |
examine casually |
1 |
decide |
1 |
reinitiate request |
1 |
examine thoroughly |
1 |
check ticket |
1 |
decide |
1 |
reject request |
Событие |
Предыдущий событие |
Кол-во переходов |
reinitiate request |
decide |
2 |
examine casually |
check ticket |
2 |
decide |
examine casually |
2 |
reject request |
decide |
1 |
register request |
|
1 |
examine thoroughly |
reinitiate request |
1 |
decide |
check ticket |
1 |
check ticket |
reinitiate request |
1 |
check ticket |
register request |
1 |
check ticket |
examine thoroughly |
1 |
Запрос:
select
resource as "Исполнитель",
lag(event.resource) as "Предыдущий исполнитель",
count(*) as "Кол-во переходов"
from event
group by "Исполнитель", "Предыдущий исполнитель"
order by "Кол-во переходов" desc
Данные на входе:
Данные на выходе:
extId |
resource |
1 |
Ellen |
1 |
Pete |
1 |
Mike |
1 |
Sara |
1 |
Sara |
1 |
Ellen |
1 |
Mike |
1 |
Sara |
1 |
Sara |
1 |
Sean |
1 |
Pete |
1 |
Sara |
1 |
Mike |
Исполнитель |
Предыдущий исполнитель |
Кол-во переходов |
Sara |
Sara |
2 |
Sara |
Mike |
2 |
Sean |
Sara |
1 |
Sara |
Pete |
1 |
Pete |
Sean |
1 |
Pete |
Ellen |
1 |
Mike |
Sara |
1 |
Mike |
Pete |
1 |
Mike |
Ellen |
1 |
Ellen |
Sara |
1 |
Ellen |
|
1 |
Запрос:
select
name as "Событие",
lag(event.name) as "Предыдущее событие",
avg(started - lag(event.ended)) as "Время между событиями"
from event
group by "Событие", "Предыдущее событие"
Или также можно взять поле IntervalFact
уже заранее рассчитанное системой с данной характеристикой. Оно считается автоматически в каждой из моделей.
select
name as "Событие",
lag(event.name) as "Предыдущее событие",
avg(intervalFact)
from event
group by "Событие", "Предыдущее событие"
Если объединить запросы, то будет видно, что данные одинаковые.
select
name as "Событие",
lag(event.name) as "Предыдущее событие",
count(*),
avg(started - lag(event.ended)) as "Время между событиями",
avg(intervalFact)
from event
group by "Событие", "Предыдущее событие"
Данные на входе:
Данные на выходе:
extId |
name |
Дата старта |
Дата окончания |
1 |
register request |
2010-12-30 11:32:00 |
2010-12-30 11:42:00 |
1 |
check ticket |
2010-12-30 12:12:00 |
2010-12-30 12:55:00 |
1 |
examine casually |
2010-12-30 14:16:00 |
2010-12-30 15:16:00 |
1 |
decide |
2011-01-05 11:22:00 |
2011-01-05 11:32:00 |
1 |
pay compensation |
2011-01-08 12:05:00 |
2011-02-08 12:05:00 |
Событие |
Предыдущее событие |
Время между событиями |
intervalFact |
register request |
|
|
|
check ticket |
register request |
1800 |
1800 |
examine casually |
check ticket |
4860 |
4860 |
decide |
examine casually |
504360 |
504360 |
pay compensation |
decide |
261180 |
261180 |