Невозможно правильно использовать SQL ведущую функцию - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть таблица с 4 столбцами: date, event_name, video_id и user_id.

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

Вот некоторые примеры данных, на которых мне нужно основать свой запрос:

date            event_name      video_id    user_id
2018-01-01      video_play      51651561651 989189198
2018-01-01      video_play      98121651656 561884864
2018-01-01      video_play      78918918918 561884864
2018-01-01      create_video    32156541355 153215651
2018-01-01      create_video    87351531311 232135135
2018-01-02      create_video    51651561651 489846581
2018-01-02      video_play      12315315352 561884864
2018-01-02      create_video    32156541355 321351351
2018-01-02      create_video    87351531311 231513515
2018-01-02      video_play      98191891894 615616516

Вот так должен выглядеть вывод:

date        users_view_videos   users_view_next_day
2018-01-01  2                   1
2018-01-02  2                   0

Этот запрос завершает первую половину задачи запроса, но я не могу понять вторую половину:

with t1 as
(select date,
count(distinct user_id) as users_view_next_day
from clickstream_videos
WHERE event_name = 'video_play'
group by 1)

select clickstream_videos.date, 
count(distinct user_id) as users_view_videos,
lead(users_view_next_day, 1) over(order by clickstream_videos.date) 
from clickstream_videos
join t1
on clickstream_videos.date = t1.date 
WHERE event_name = 'video_play'
group by 1, t1.users_view_next_day

Спасибо.

1 Ответ

2 голосов
/ 23 апреля 2020

Если вы сделаете CTE, в котором перечислены все отдельные пользователи, которые смотрели видео в определенный день, это может быть использовано для подсчета пользователей, которые смотрели видео в определенный день. Затем вы можете присоединить его к себе при условии, что дата во второй таблице - следующий день, а user_id - то же самое, чтобы получить число тех, кто просматривал видео в этот день и на следующий день:

WITH viewers AS (
  SELECT DISTINCT date, user_id
  FROM clickstream_videos
  WHERE event_name = 'video_play'
)
SELECT v1.date, 
       COUNT(v1.user_id) AS user_view_videos,
       COUNT(v2.user_id) AS users_view_next_day
FROM viewers v1
LEFT JOIN viewers v2 ON v2.date = v1.date + interval '1 day'
                    AND v2.user_id = v1.user_id
GROUP BY v1.date

Вывод:

date                        user_view_videos    users_view_next_day
2018-01-01T00:00:00.000Z    2                   1
2018-01-02T00:00:00.000Z    2                   0

Демонстрация на dbfiddle

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