Как отображать изменения в логинах за одну неделю, сегментированные по группам - PullRequest
0 голосов
/ 03 февраля 2019

Цель: Я должен сегментировать электронные письма по месяцу их подписки, что будет определять когорты.Другими словами, все, кто подписался в январе 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    

1 Ответ

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

В ваших данных много странностей.Почему ключ join является адресом электронной почты, а не идентификатором участника?Почему элементы электронной почты «создаются» несколько раз?

Чтобы предотвратить выход из-под контроля объединений, я обобщаю каждую из таблиц перед выполнением объединения.Это приводит к желаемым результатам:

select datename(year, m.creation_date) + '-' + datename(month, m.creation_date) as yyyymm,
       count(distinct m.email) as num_members,
       sum(case when l.yyyy = 2019 and l.isoweek = 2 then 1 else 0 end) as cnt_201902,
       sum(case when l.yyyy = 2019 and l.isoweek = 3 then 1 else 0 end) as cnt_201903
from (select m.email, min(creation_date) as creation_date
      from member m
      group by m.email
     ) m left join
     (select distinct l.email, year(l.login_date) as yyyy, datepart(iso_week, l.login_date) as isoweek
      from login l
     ) l
     on m.email = l.email
group by datename(year, m.creation_date) + '-' + datename(month, m.creation_date) 
order by yyyymm;

Здесь - это дб <> скрипка.

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