Как найти разницу между одинаковыми значениями столбцов в разных строках с условием в красном смещении?

#sql #amazon-redshift

#sql #амазонка-красное смещение

Вопрос:

У меня есть набор данных чата с действиями пользователей, которые присоединяются и покидают комнату. Пользователь может присоединиться и покинуть комнату несколько раз. Мне нужно узнать время, потраченное каждым пользователем на каждую комнату.

 room_id user_id event time   1 1 join 2021-12-10 09:00:00   1 2 join 2021-12-10 09:10:00   1 3 join 2021-12-10 09:20:00   1 2 leave 2021-12-10 09:30:00   1 1 leave 2021-12-10 09:40:00   1 1 join 2021-12-10 09:50:00   1 3 leave 2021-12-10 10:00:00   1 1 leave 2021-12-10 10:10:00   

Что мне нужно, так это:

 room_id user_id time_spend  1 1 60  1 2 20  1 1 30      

Я новичок в красном смещении. Я попытался использовать функцию задержки, но не смог добавить условие, например, присоединиться и уйти. Может ли кто-нибудь помочь мне решить эту проблему?

Ответ №1:

Вот начало, основанное на ваших образцах данных:

 create table test (room_id int, user_id int, event varchar(16), event_time timestamp);  insert into test values  (1, 1, 'join', '2021-12-10 09:00:00'), (1, 2, 'join', '2021-12-10 09:10:00'),  (1, 3, 'join', '2021-12-10 09:20:00'),  (1, 2, 'leave', '2021-12-10 09:30:00'),  (1, 1, 'leave', '2021-12-10 09:40:00'),  (1, 1, 'join', '2021-12-10 09:50:00'),  (1, 3, 'leave', '2021-12-10 10:00:00'),  (1, 1, 'leave', '2021-12-10 10:10:00') ;  select * from test order by user_id, event_time;  select room_id, user_id, sum(time_spent) as time_spent from (  select room_id, user_id, event_time, decode(event,'join',event_time) as join_time,   lead(decode(event,'leave',event_time)) ignore NULLS OVER (partition by room_id, user_id order by event_time) as leave_time,  datediff(min, join_time, leave_time) as time_spent  from test) group by room_id, user_id order by room_id, user_id;