Динамически сравнивать неделю к неделе по группам - PullRequest
0 голосов
/ 07 февраля 2019

Цель:

Получить идентификаторы входа в систему на неделе 1. Затем, сколько таких идентификаторов вошли в систему на неделе 2. Перезапустите ту же логику для 2-й недели и 3-й недели. Затем 3-я неделя.и неделя 4 и так далее ... Это упражнение нужно делать каждую неделю.Идентификаторы должны быть сегментированы по группам, которые являются месяцем и годом, на который они подписаны.

История:

В первой таблице (элементе) есть электронная почта и дата ее создания.2-я таблица (таблица входа в систему) - это активность входа в систему.Во-первых, мне нужно сгруппировать электронные письма по дате создания (месяц-год) для создания когорт.Затем активность входа в систему сравнивается неделя с неделей для каждой группы.Возможно ли, чтобы этот запрос был динамическим каждую неделю?

Вывод: Результат должен выглядеть следующим образом:

+--------+--------+--------+--------+---------+
| Cohort | 2019-1 | 2019-2 | 2019-3 | 2019-4  |...
+--------+--------+--------+--------+---------+
| 2018-3 |   7000 |   6800 |    7400|    7100 |...
| 2018-4 |   6800 |   6500 |    8400|    8000 |...
| 2018-5 |   9500 |   8000 |    6400|    6200 |...
| 2018-6 |   9100 |   8500 |    8000|    7800 |...
| 2018-7 |  10000 |   8000 |    7000|    6800 |...
+--------+--------+--------+--------+---------+

Что я пытался:

SELECT CONCAT(DATEPART(YEAR,m.date_created),'-',DATEPART(MONTH,m.date_created)) AS Cohort
    ,CONCAT(subquery.[YYYY],'-',subquery.[ISO])                     AS YYYY_ISO
    ,m.email
FROM member as m
INNER JOIN (SELECT DATEPART(YEAR,log.login_time)    AS [YYYY]
        ,DATEPART(ISO_WEEK,log.login_time)  AS [ISO]
        ,log.email
        ,ROW_NUMBER()
            OVER(PARTITION BY 
            DATEPART(YEAR,log.login_time), 
            DATEPART(ISO_WEEK,log.login_time),
            log.email
        ORDER BY log.login_time ASC) AS Log_Rank
        FROM login AS log
        WHERE CAST(log.login_time AS DATE) >= '2019-01-01'
        ) AS subquery ON m.email=subquery.email AND Log_Rank = 1
ORDER BY cohort 

Пример данных:

CREATE TABLE member
    ([email] varchar(50), [date_created] Datetime)

CREATE TABLE login
    ([email] varchar(50), [login_time] Datetime)

INSERT INTO member
VALUES
    ('player123@google.com', '2018-03-01 05:00:00'),
    ('player999@google.com', '2018-04-12 12:00:00'),
    ('player555@google.com', '2018-04-25 20:15:00')

INSERT INTO login
VALUES
    ('player123@google.com', '2019-01-07 05: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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...