Вы можете попробовать использовать LEAD
оконную функцию с CASE WHEN
в подзапросе.
Затем использовать агрегатную функцию sum
и count
для получения результата.
CREATE TABLE my_table(
event_timestamp TIMESTAMP,
item_id VARCHAR(50)
);
INSERT INTO my_table VALUES ('2018-08-08 12:39:56','btnA');
INSERT INTO my_table VALUES ('2018-08-08 12:37:26','btnB');
INSERT INTO my_table VALUES ('2018-08-08 12:37:09','btnA');
INSERT INTO my_table VALUES ('2018-08-08 12:36:41','btnB');
INSERT INTO my_table VALUES ('2018-08-08 12:34:06','btnA');
INSERT INTO my_table VALUES ('2018-08-08 12:33:56','btnB');
INSERT INTO my_table VALUES ('2018-08-08 12:30:32','btnB');
INSERT INTO my_table VALUES ('2018-08-08 12:29:55','btnB');
INSERT INTO my_table VALUES ('2018-07-13 01:48:17','btnB');
INSERT INTO my_table VALUES ('2018-07-12 03:31:07','btnA');
INSERT INTO my_table VALUES ('2018-07-12 01:52:50','btnB');
INSERT INTO my_table VALUES ('2018-07-11 17:01:56','btnA');
INSERT INTO my_table VALUES ('2018-07-11 16:32:16','btnA');
INSERT INTO my_table VALUES ('2018-07-09 06:56:49','btnB');
Запрос № 1
SELECT 'btnA' from_item_id,
'btnB' to_item_id,
sum(secondDiff) total_seconds,
sum(secondDiff) / COUNT(*) average_seconds
FROM (
SELECT *,
(CASE WHEN item_id = 'btnA'
and
LEAD(item_id) OVER(ORDER BY event_timestamp) = 'btnB'
THEN extract(epoch from (LEAD(event_timestamp) OVER(ORDER BY event_timestamp )- event_timestamp))
ELSE 0 END) secondDiff
FROM my_table
) t1
WHERE seconddiff > 0;
| from_item_id | to_item_id | total_seconds | average_seconds |
| ------------ | ---------- | ------------- | --------------- |
| btnA | btnB | 112256 | 28064 |
Просмотр на скрипте БД