Спаривание записей SQL и вычисление временного интервала - PullRequest
0 голосов
/ 25 декабря 2018

Я хотел бы рассчитать интервал времени для конкретных записей.Вот мой SQL-запрос и записи.

select event_timestamp, item_id from my_table where event_type='item_clicked' and (item_id='btnA' or item_id='btnB') and user_id='5afcd689c926dc6b1573d7cbff23aa7e' order by event_timestamp DESC

event_timestamp item_id
2018-08-08 12:39:56 btnA
2018-08-08 12:37:26 btnB
2018-08-08 12:37:09 btnA
2018-08-08 12:36:41 btnB
2018-08-08 12:34:06 btnA
2018-08-08 12:33:56 btnB
2018-08-08 12:30:32 btnB
2018-08-08 12:29:55 btnB
2018-07-13 01:48:17 btnB
2018-07-12 03:31:07 btnA
2018-07-12 01:52:50 btnB
2018-07-11 17:01:56 btnA
2018-07-11 16:32:16 btnA
2018-07-09 06:56:49 btnB

Однако я хотел бы рассчитать временной интервал различных изменений состояния item_id.

Например, я хочу знать, когда пользователь нажимает кнопку btnA и сколько времени после этого он нажимает кнопку btnB.Как я могу сгенерировать такую ​​таблицу по SQL-запросу?

from_item_id    to_item_id    total_seconds    average_seconds
btnA            btnB          112256           28064

[Note]
2018/7/11  5:01:56 PM -> 2018/7/12  1:52:50 AM: 31854 seconds
2018/7/12  3:31:07 AM -> 2018/7/13  1:48:17 AM: 80230 seconds
2018/8/8  12:34:06 PM -> 2018/8/8  12:36:41 PM: 155 seconds
2018/8/8  12:37:09 PM -> 2018/8/8  12:37:26 PM: 17 seconds
And the total seconds is 112256, and the average is 28064.

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Я бы использовал кумулятивный минимум условия для расчета времени следующего события b.Это кажется самым простым методом:

select user_id,
       'btnA' from_item_id,
       'btnB' to_item_id,
       sum(datediff(second, event_timestamp, next_b)) as total_seconds, 
       avg(datediff(second, event_timestamp, next_b)) as average_seconds
from (select t.*,
             min(case when item_id = 'btnB' then event_timestamp end) over (partition by user_id order by event_timestamp desc) as next_b
      from my_table t
     ) t
where item_id = 'btnA'
group by user_id;
0 голосов
/ 25 декабря 2018

Вы можете попробовать использовать 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           |

Просмотр на скрипте БД

...