SQL группа по функции для отображения целевой страницы (первой страницы) сеанса - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть две таблицы, содержащие данные сессий веб-сайта:

  • Сеансы - идентификатор_ сессии (PK), сессия_даты, источник_ трафика

  • PageViews - event_id (PK), session_id, timestamp, page_name

Как получить количество сеансов за данный день, суммированное по целевой странице (первая страница, увиденная в сеансе)?

Предположим, что это пример данных в двух таблицах:

Сеансы:

SESSION_ID  SESSION_DATE    TRAFFIC_SOURCE
1           24-FEB-19        Google
2           23-FEB-19        Amazon
3           22-FEB-19        Clickstream
4           21-FEB-19        BloggerVlogger
5           24-FEB-19        DuckDuckGoGo

Просмотры страниц:

EVENT_ID    SESSION_ID  TIMESTAMP                       PAGE_NAME
11           1          24-FEB-19 12.10.09.000000 PM    Home_page
12           2          23-FEB-19 01.10.09.000000 PM    Catalog
13           3          22-FEB-19 02.10.09.000000 PM    Shopping_Cart
14           4          21-FEB-19 03.10.09.000000 PM    Home_page
15           5          24-FEB-19 04.10.09.000000 PM    Purchase_Summary
16           5          24-FEB-19 05.10.09.000000 PM    Purchase_History

Я пытался:

select 
    session_date, 
    count(s.session_id) as count_of_sessions, 
    min(p.timestamp) as first_page_timestamp
from sessions s, pageviews p
where s.session_id=p.session_id
group by session_date

И вот такой вывод я получаю:

SESSION_DATE    COUNT_OF_SESSIONS   FIRST_PAGE_TIMESTAMP
21-FEB-19         1                 21-FEB-19 03.10.09.000000 PM
22-FEB-19         1                 22-FEB-19 02.10.09.000000 PM
24-FEB-19         2                 24-FEB-19 04.10.09.000000 PM
24-FEB-19         1                 24-FEB-19 12.10.09.000000 PM
23-FEB-19         1                 23-FEB-19 01.10.09.000000 PM

Если я включу page_name в оператор выбора и предложение group_by,он дает мне ВСЕ страницы для этого сеанса (Purchase_Summary и Purchase_History для session_id 5), и мне нужна только первая страница (Purchase Summary).

Как я могу включить имя_страницы в свой запрос SQL, когда я хочу группировать только по дате сеанса?Должен ли я использовать что-то, кроме группы по?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Используйте row_number().Я думаю, что вы хотите:

select s.*, p.*
from sessions s left join
     (select p.*,
             row_number() over (partition by p.session_id order by p.timestamp asc) as seqnum
      from pageviews p
     ) p
     on s.session_id = p.session_id and p.seqnum = 1;

Вы также можете объединить это:

select s.session_date, p.page_name,
       count(*) as count_of_sessions, 
       min(p.timestamp) as first_page_timestamp
from sessions s left join
     (select p.*,
             row_number() over (partition by p.session_id order by p.timestamp asc) as seqnum
      from pageviews p
     ) p
     on s.session_id = p.session_id and p.seqnum = 1
group by s.session_date, p.page_name;
0 голосов
/ 26 февраля 2019

Ваша текущая логика уже довольно хороша.Вы можете просто добавить условие NOT EXISTS в ваше предложение WHERE с коррелированным подзапросом, который гарантирует, что текущая запись является первой для текущего сеанса.

Я предполагаю, что event_id может использоваться для сортировки записей, если нет, вы можете захотеть изменить его на что-то другое (timestamp возможно).

SELECT 
    s.session_date, 
    COUNT(s.session_id) as count_of_sessions, 
    MIN(p.timestamp) as first_page_timestamp
FROM sessions s
INNER JOIN pageviews p ON s.session_id = p.session_id
WHERE NOT EXISTS (
    SELECT 1 
    FROM pageviews p1 
    WHERE p1.session_id = p.session_id AND p1.event_id < p.event_id
)
GROUP BY session_date

Примечание: всегда используйтеявные JOIN s вместо старого стиля, неявные JOIN s (я соответственно адаптировал запрос).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...