Я довольно новичок в ИТ-индустрии, и поэтому был бы рад получить некоторую помощь в написании запросов (в Redshift).
Я попытался выяснить 1) сколько пользователей присоединилось к нашему сервису в феврале, 2) какие пользователи повторно посетили сайт после дня, когда они присоединились, и сделали ли они тогда, когда? (т. е. day1, day2, day3, ... и т. д.) и 3) сколько чтения / показа было получено каждым пользователем в день посещения.
Ниже приведены таблицы и соответствующие столбцы, которые мне были предоставлены.
The tables and relevant columns I have been provided are as following
I) users: id created_at
4,578,001 2018-05-16 00:02
4,578,002 2018-05-16 00:02
4,578,007 2018-05-16 00:10
II) user_content_action_by_traffic_source: id created_at action_type
4,428,830 2018-05-16 00:00 read
3,154,331 2018-05-16 00:00 read
714,795 2018-05-16 00:00 impression
where the column 'created_at in I)' shows the date of account created,
and the column 'created_at in II)' shows the date of action recorded (i.e. a user reads a post)
- Example codes with the above tables:
SELECT u.created_at,
u.id,
SUM(CASE WHEN s.action_type = 'read' THEN 1 ELSE 0 END) AS read,
SUM(CASE WHEN s.action_type = 'impression' THEN 1 ELSE 0 END) AS impression
FROM users u INNER JOIN user_content_action_by_traffic_source s ON u.id = s.user_id
WHERE u.created_at >= CURRENT_DATE - INTERVAL '2 days'
GROUP BY 1, 2
ORDER BY 1
LIMIT 10
- Example output: created_at id read impression
2018-05-16 00:00 4,577,999 2 38
2018-05-16 00:01 4,578,000 1 77
2018-05-16 00:02 4,578,001 2 48
Приведенные ниже коды - это то, что я впервые написал (и я знаю, что мой не очень хороший)
WITH t1 (SELECT convert_timezone('Asia/Seoul', u.created_at) AS created_at,
u.id AS new_user,
COUNT(DISTINCT date_trunc('day', convert_timezone('Asia/Seoul', action.created_at))) AS num_of_days_visited
FROM users u JOIN user_content_action_by_traffic_source action ON u.id = action.user_id
WHERE DATE(u.created_at) >= '2018-02-01'
AND DATE(u.created_at) <= '2018-02-28'
AND action.created_at >= u.created_at
AND action.created_at <= u.created_at + INTERVAL '4 weeks'
GROUP BY 1, 2
ORDER BY 1, 2)
SELECT DATE(t1.created_at),
t1.new_user,
DATE(convert_timezone('Asia/Seoul', action.created_at)) AS date_visited,
SUM(CASE WHEN action.action_type = 'read' THEN 1 ELSE 0 END) AS Read,
SUM(CASE WHEN action.action_type = 'impression' THEN 1 ELSE 0 END) AS Imp
FROM t1 JOIN user_content_action_by_traffic_source action ON t1.new_user = action.user_id
WHERE convert_timezone('Asia/Seoul', action.created_at) >= t1.created_at
AND convert_timezone('Asia/Seoul', action.created_at) <= t1.created_at + INTERVAL '4 weeks'
AND action.content_type = 'post'
AND t1.num_of_days_visited = 2
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3
Обратите внимание, что городом, в котором я работаю, является Сеул / Корея, тогда как часовой пояс для записи даты основан на США.
Следующие результаты были
date new_user date_visited read imp
1 2018-02-01 4432986 2018-02-02 2 8
2 2018-02-01 4432987 2018-02-02 5 49
3 2018-02-01 4432987 2018-02-26 1 0
4 2018-02-01 4432992 2018-02-02 6 169
Мои желательные результаты будут
date new_user date_visited read imp date_visited_2 read2 imp2
1 2018-02-01 4432986 2018-02-02 2 8
2 2018-02-01 4432987 2018-02-02 5 49 2018-02-26 1 0
3 2018-02-01 4432992 2018-02-02 6 169
Если в моем описании кодов или данных примеров отсутствует информация, оставьте комментарий.
Спасибо