Моей задачей было открыть пробный кластер Redshift и загрузить туда данные из csv-файла.
В файле csv была указана информация об идентификаторе пользователя, странице, которую он посетил, и времени посещения до миллисекунд.
Задача состоит в том, чтобы найти все «сеансы», в которых пользователь выполнил следующие действия в указанном порядке: rooms.homework-showcase, rooms.view.step.content, rooms.lesson.rev.step.content. (Может он делал это не последовательно).
Под "сессией" подразумевается, что время между действиями не превышает одного часа.
Вывод должен состоять из идентификатора пользователя, времени начала сеанса и времени окончания сеанса.
Пример того, что дано в CSV:
57529,rooms.homework-showcase,2017-03-01T00:00:07.710000
57529,rooms.view.step.content,2017-03-01T00:00:10.275000
57529,rooms.view.step.content,2017-03-01T00:00:10.436000
168671,rooms.view.step.content,2017-03-01T00:00:12.035000
168671,rooms.view.step.content,2017-03-01T00:00:50.632000
64788,rooms.view.step.content,2017-03-01T00:01:21.460000
93698,rooms.view.step.content,2017-03-01T00:02:41.963000
205265,rooms.homework-showcase,2017-03-01T00:02:45.241000
205265,rooms.test-showcase,2017-03-01T00:02:57.854000
205265,notes,2017-03-01T00:03:01.016000
То, что я написал до сих пор:
select *,
case
when timepass IS NULL then ncount
when (timepass>=3600) and lag(timepass<3600) over(order by user_id, datet)
then ncount
else Null
end as startt,
case
when (timepass<3600) and lead(timepass IS NULL) over(order by user_id,
datet) then ncount
when (timepass<3600) and lead(timepass>=3600) over(order by user_id, datet)
then ncount
else Null
end as endt
from
(
select *, row_number() OVER(ORDER BY user_id, datet) as ncount,
case
when page_name = 'rooms.homework-showcase' then 0
when page_name = 'rooms.view.step.content' then 1
when page_name = 'rooms.lesson.rev.step.content' then 2
else 3
end as page_order
from
(
select *, EXTRACT(EPOCH from datet) - lag(EXTRACT(EPOCH from datet))
over(partition by user_id order by user_id, datet) as timepass from
(
SELECT *, to_timestamp(date_time, 'YYYY-MM-DD HH:MI:SS:US') as datet from
testtbl
order by date_time asc
) as t1
group by user_id, page_name, date_time, datet
order by user_id, datet asc
) as t3
) as t4
;
мой результат
Я могу выяснить начало сеанса и его конец (за исключением того, что я не знаю, как включить последний ряд в качестве конца сеанса). Один пользователь может иметь несколько сеансов.
Как я могу запросить нужные сеансы и извлечь из них user_id, начало и конец сеанса? Не могли бы вы дать мне несколько идей? У меня недостаточно знаний по SQL, чтобы найти способ написать правильный запрос.
P.S. Я приложил, как должен выглядеть вывод. Это показывает конкретного пользователя и его один сеанс, который подпадает под заданные критерии. Ожидаемый результат - последняя картина. И там должны быть перечислены все «хорошие» сеансы.
CSV-файл находится по этой ссылке https://drive.google.com/open?id=0B288Ep6mrn6fWlQ0a3doV0hjQjA
DB Fiddle https://www.db -fiddle.com / f / bz92LHiTW5RrFBUkaH2KtR / 0 # & Togetherjs = m6SnA9xLSS