Использование SQL для запроса user_id, времени начала и окончания сеанса, если мы знаем только user_id, actions_made и время посещения - PullRequest
0 голосов
/ 23 июня 2018

Моей задачей было открыть пробный кластер 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

1 Ответ

0 голосов
/ 24 июня 2018

Я запустил образец данных, которые вы предоставили, используя приведенный ниже код, через само присоединение. Ниже приведен код:

выберите user_id, session_begin, max (session_end) в качестве session_end из

(выберите user_id, session_begin, случай, когда session_end равен нулю, затем session_begin, иначе session_end end как session_end из

(выберите a.user_id в качестве user_id, a.datevisited, a.date_time в качестве session_begin, a.session_hour, случай, когда (b.date_time> a.date_time и a.session_hour> = b.date_time) затем b.date_time else нулевой конец как session_end от

(выберите user_id, trunc (date_time) в качестве datevisited, date_time, dateadd (hour, 1, date_time) session_hour со страниц) a

оставил соединение (выберите user_id, trunc (date_time) в качестве datevisited, date_time, dateadd (hour, 1, date_time) session_hour со страниц) b

для a.user_id = b.user_id и a.datevisited = b.datevisited

группа по 1,2,3,4,5)

группа по 1,2,3) финал

группа по 1,2;

Проверьте это на своем конце. Для различных функций, используемых в коде, вы можете обратиться к документации Redshift: https://docs.aws.amazon.com/redshift/latest/dg/r_DATEADD_function.html https://docs.aws.amazon.com/redshift/latest/dg/r_DATEDIFF_function.html

...