Приведенный ниже запрос возвращает набор данных, который показывает, сколько пользователей вошли в систему в последующие недели.
SELECT
MONTH(u.created) as monthly, YEAR(u.created) as yearly, count(DISTINCT u.user_id) as new_users,
COUNT(DISTINCT CASE WHEN lh.login_time BETWEEN u.created AND (u.created + INTERVAL 1 WEEK) THEN u.user_id END) AS week1,
COUNT(DISTINCT CASE WHEN lh.login_time BETWEEN DATE_ADD(u.created, INTERVAL 1 WEEK) AND ( DATE_ADD(u.created, INTERVAL 1 WEEK) + INTERVAL 1 WEEK) THEN u.user_id END) AS week2,
COUNT(DISTINCT CASE WHEN lh.login_time BETWEEN DATE_ADD(u.created, INTERVAL 2 WEEK) AND ( DATE_ADD(u.created, INTERVAL 2 WEEK) + INTERVAL 1 WEEK) THEN u.user_id END) AS week3,
COUNT(DISTINCT CASE WHEN lh.login_time BETWEEN DATE_ADD(u.created, INTERVAL 3 WEEK) AND ( DATE_ADD(u.created, INTERVAL 3 WEEK) + INTERVAL 1 WEEK) THEN u.user_id END) AS week4,
COUNT(DISTINCT CASE WHEN lh.login_time BETWEEN DATE_ADD(u.created, INTERVAL 4 WEEK) AND ( DATE_ADD(u.created, INTERVAL 4 WEEK) + INTERVAL 1 WEEK) THEN u.user_id END) AS week5,
COUNT(DISTINCT CASE WHEN lh.login_time BETWEEN DATE_ADD(u.created, INTERVAL 5 WEEK) AND ( DATE_ADD(u.created, INTERVAL 5 WEEK) + INTERVAL 1 WEEK) THEN u.user_id END) AS week6,
COUNT(DISTINCT CASE WHEN lh.login_time BETWEEN DATE_ADD(u.created, INTERVAL 6 WEEK) AND ( DATE_ADD(u.created, INTERVAL 6 WEEK) + INTERVAL 1 WEEK) THEN u.user_id END) AS week7,
COUNT(DISTINCT CASE WHEN lh.login_time BETWEEN DATE_ADD(u.created, INTERVAL 7 WEEK) AND ( DATE_ADD(u.created, INTERVAL 7 WEEK) + INTERVAL 1 WEEK) THEN u.user_id END) AS week8,
COUNT(DISTINCT CASE WHEN lh.login_time BETWEEN DATE_ADD(u.created, INTERVAL 8 WEEK) AND ( DATE_ADD(u.created, INTERVAL 8 WEEK) + INTERVAL 1 WEEK) THEN u.user_id END) AS week9,
COUNT(DISTINCT CASE WHEN lh.login_time BETWEEN DATE_ADD(u.created, INTERVAL 9 WEEK) AND ( DATE_ADD(u.created, INTERVAL 9 WEEK) + INTERVAL 1 WEEK) THEN u.user_id END) AS week10
FROM
users as u
LEFT JOIN
login_history as lh
ON u.user_id = lh.user_id
GROUP BY
YEAR(u.created), MONTH(u.created)
ORDER BY
YEAR(u.created) DESC, MONTH(u.created) DESC
LIMIT 10;
Вывести как:
monthly, yearly, new_users, week1, week2, week3, week4, week5, week6, week7, week8, week9, week10
3, 2019, 1418, 676, 131, 107, 55, 8, 0, 0, 0, 0, 0
2, 2019, 1452, 707, 241, 234, 239, 202, 157, 93, 32, 2, 0
1, 2019, 2664, 1178, 469, 404, 359, 332, 316, 284, 321, 321, 214
12, 2018, 1574, 340, 50, 88, 53, 17, 47, 50, 29, 48, 19
11, 2018, 1608, 689, 138, 97, 84, 87, 76, 46, 55, 51, 54
10, 2018, 5349, 1817, 763, 691, 656, 585, 531, 478, 465, 455, 422
9, 2018, 5318, 2959, 1295, 1330, 1172, 1101, 1137, 1099, 971, 913, 917
8, 2018, 209, 73, 11, 9, 8, 8, 8, 9, 12, 10, 8
7, 2018, 223, 57, 7, 4, 1, 1, 0, 0, 0, 1, 1
6, 2018, 172, 62, 11, 6, 9, 6, 5, 4, 3, 1, 0