🖥 Вопросы собеседований



Удержание пользователей в месяц



Контекст: допустим, у нас есть статистика по авторизации пользователей на сайте в таблице logins:



| user_id | date |

|---------|------------|

| 1 | 2018-07-01 |

| 234 | 2018-07-02 |

| 3 | 2018-07-02 |

| 1 | 2018-07-02 |

| ... | ... |

| 234 | 2018-10-04 |



Задача: написать запрос, который получает количество удержанных пользователей в месяц. В нашем случае данный параметр определяется как количество пользователей, которые авторизовались в системе и в этом, и в предыдущем месяце.



Решение:



SELECT

DATE_TRUNC('month', a.date) month_timestamp,

COUNT(DISTINCT a.user_id) retained_users

FROM

logins a

JOIN

logins b ON a.user_id = b.user_id

AND DATE_TRUNC('month', a.date) = DATE_TRUNC('month', b.date) +

interval '1 month'

GROUP BY

date_trunc('month', a.date)




@sqlhub