Цель: Я должен сегментировать электронные письма по месяцу их подписки, что будет определять когорты.Другими словами, все, кто подписался в январе 2018 года, находятся в одной когорте, а февраль 2018 - в другой.Затем мне нужно посмотреть на их активность входа в систему от одной недели к другой.Если 100 подписчиков из группы январь 2008 года войдут в ISO_WEEK 2 от 2019 года и 70 из них войдут в ISO_WEEK 3, это удержание составит 70%.
Проблема : я не знаю, какчтобы написать свой запрос, чтобы в качестве первого столбца были указаны когорты (например, январь 2018, февраль2018, март 2018), а следующие столбцы - это число операций входа в систему для отдельных электронных писем по ISO_WEEK, начиная с 2019 года.
Образцы данных:
CREATE TABLE member
([email] varchar(50), [creation_date] Datetime)
INSERT INTO member
VALUES
('player123@google.com', '2018-01-01 05:00:00'),
('player999@google.com', '2018-01-30 12:00:00'),
('player555@google.com', '2018-05-14 20:15:00')
CREATE TABLE login
([email] varchar(100), [login_date] Datetime)
INSERT INTO login
VALUES
('player123@google.com', '2019-01-07 05:30:00'),
('player123@google.com', '2019-01-07 09:30:00'),
('player123@google.com', '2019-01-08 08:30:00'),
('player123@google.com', '2019-01-15 06:30:00'),
('player999@google.com', '2019-01-08 11:30:00'),
('player999@google.com', '2019-01-10 07:30:00'),
('player555@google.com', '2019-01-08 04:30:00')
Что я пробовал:
;with
cte1 AS (
SELECT CAST(Creation_Date AS Date) AS Creation_Date
,CONCAT(DATEPART(MONTH,Creation_Date),'-',DATEPART(YEAR,Creation_Date)) AS Cohort
,email AS Emails
FROM member
),
cte2 AS (
SELECT Logins
,yy
,login_ISOWeeks
,Emails
FROM (
SELECT CAST(login_date as Date) AS Logins
,DATEPART(YEAR, login_date) AS yy
,DATEPART(ISO_WEEK,login_date) AS login_ISOWeeks
,email AS Emails
,ROW_NUMBER()
OVER(PARTITION BY DATEPART(YEAR, login_date), DATEPART(ISO_WEEK,login_date), email ORDER BY login_date ASC) AS week_count
FROM login) as f_log
WHERE f_log.week_count = 1
)
SELECT cte1.Creation_Date
,cte1.Cohort
,cte2.yy
,cte2.login_ISOWeeks
,cte1.Emails
FROM cte1
INNER JOIN cte2 ON cte1.Emails=cte2.Emails
Желаемый вывод:
Cohort 2019_2 2019_3
jan 2018 2 1
may 2018 1 0