Wskaźnik retencji definiuje się jako liczbę klientów, którzy nadal korzystają z produktu/usługi. Obliczenie analizy retencji kohorty jest trudne. Oto jak obliczyć wskaźnik retencji w SQL do analizy retencji klientów. Możesz go użyć do obliczenia wskaźnika retencji w MySQL, PostgreSQL, SQL Server i Oracle. Przyjrzymy się również zapytaniu SQL pod kątem utrzymania klientów. Wskaźnik utrzymania jest mierzony jako liczba powracających użytkowników w regularnych odstępach czasu, na przykład co tydzień lub miesiąc, pogrupowanych według tygodnia rejestracji.
Obliczymy retencję według tygodniowej kohorty w SQL i otrzymamy tabelę taką jak ta poniżej, która pokazuje liczbę klientów, którzy zalogowali się ponownie po pierwszej rejestracji kilka tygodni temu, dla każdego tygodnia rejestracji.

Jak obliczyć współczynnik retencji w SQL?
Oto kroki, aby obliczyć wskaźnik retencji w SQL. Załóżmy, że masz poniższą tabelę, która przechowuje identyfikator_użytkownika i datę_logowania każdej wizyty użytkownika.
mysql> create table login(login_date date,user_id int, id int not null auto_increment, primary key (id));
mysql> insert into login(login_date,user_id)
values('2020-01-01',10),('2020-01-02',12),('2020-01-03',15),
('2020-01-04',11),('2020-01-05',13),('2020-01-06',9),
('2020-01-07',21),('2020-01-08',10),('2020-01-09',10),
('2020-01-10',2),('2020-01-11',16),('2020-01-12',12),
('2020-01-13',10),('2020-01-14',18),('2020-01-15',15),
('2020-01-16',12),('2020-01-17',10),('2020-01-18',18),
('2020-01-19',14),('2020-01-20',16),('2020-01-21',12),
('2020-01-22',21),('2020-01-23',13),('2020-01-24',15),
('2020-01-25',20),('2020-01-26',14),('2020-01-27',16),
('2020-01-28',15),('2020-01-29',10),('2020-01-30',18);
mysql> select * from login;
+------------+---------+----+
| login_date | user_id | id |
+------------+---------+----+
| 2020-01-01 | 10 | 1 |
| 2020-01-02 | 12 | 2 |
| 2020-01-03 | 15 | 3 |
| 2020-01-04 | 11 | 4 |
| 2020-01-05 | 13 | 5 |
| 2020-01-06 | 9 | 6 |
| 2020-01-07 | 21 | 7 |
| 2020-01-08 | 10 | 8 |
| 2020-01-09 | 10 | 9 |
| 2020-01-10 | 2 | 10 |
| 2020-01-11 | 16 | 11 |
| 2020-01-12 | 12 | 12 |
| 2020-01-13 | 10 | 13 |
| 2020-01-14 | 18 | 14 |
| 2020-01-15 | 15 | 15 |
| 2020-01-16 | 12 | 16 |
| 2020-01-17 | 10 | 17 |
| 2020-01-18 | 18 | 18 |
| 2020-01-19 | 14 | 19 |
| 2020-01-20 | 16 | 20 |
| 2020-01-21 | 12 | 21 |
| 2020-01-22 | 21 | 22 |
| 2020-01-23 | 13 | 23 |
| 2020-01-24 | 15 | 24 |
| 2020-01-25 | 20 | 25 |
| 2020-01-26 | 14 | 26 |
| 2020-01-27 | 16 | 27 |
| 2020-01-28 | 15 | 28 |
| 2020-01-29 | 10 | 29 |
| 2020-01-30 | 18 | 30 |
+------------+---------+----+
Będziemy tworzyć cotygodniową analizę kohortową. W zależności od produktu/usługi możesz zmienić ją na miesięczną/dzienną.
Będziemy używać MySQL do obliczania wskaźnika retencji w SQL. Możesz także obliczyć współczynnik rezygnacji dla PostgreSQL.
1. Wizyty zbiorcze według tygodnia
Aby obliczyć wskaźnik retencji w SQL, najpierw pogrupujemy każdą wizytę według tygodnia logowania.
mysql> SELECT
user_id,
week(login_date) AS login_week
FROM login
GROUP BY user_id,week(login_date);
+---------+------------+
| user_id | login_week |
+---------+------------+
| 2 | 1 |
| 9 | 1 |
| 10 | 0 |
| 10 | 1 |
| 10 | 2 |
| 10 | 4 |
| 11 | 0 |
| 12 | 0 |
| 12 | 2 |
| 12 | 3 |
| 13 | 1 |
| 13 | 3 |
| 14 | 3 |
| 14 | 4 |
| 15 | 0 |
| 15 | 2 |
| 15 | 3 |
| 15 | 4 |
| 16 | 1 |
| 16 | 3 |
| 16 | 4 |
| 18 | 2 |
| 18 | 4 |
| 20 | 3 |
| 21 | 1 |
| 21 | 3 |
+---------+------------+
Sprawdź także Jak obliczyć tygodniowych aktywnych użytkowników (WAU) w MySQL.
2. Oblicz PIERWSZY TYDZIEŃ logowania dla każdego użytkownika
Następnie, aby obliczyć wskaźnik retencji w SQL, musimy obliczyć pierwszy tydzień logowania dla każdego użytkownika. Po prostu użyjemy funkcji MIN i GROUP BY, aby obliczyć pierwszy tydzień logowania dla każdego użytkownika
mysql> SELECT
user_id,
min(week(login_date)) AS first_week
FROM login
GROUP BY user_id;
+---------+------------+
| user_id | first_week |
+---------+------------+
| 2 | 1 |
| 9 | 1 |
| 10 | 0 |
| 11 | 0 |
| 12 | 0 |
| 13 | 1 |
| 14 | 3 |
| 15 | 0 |
| 16 | 1 |
| 18 | 2 |
| 20 | 3 |
| 21 | 1 |
+---------+------------+
3. Połącz 2 tabele dla login_week i first_week
Następnie otrzymujemy login_week i first_week obok siebie dla każdego użytkownika przy użyciu poniższego zapytania, z INNER JOIN, aby obliczyć współczynnik retencji w SQL.
mysql> select a.user_id,a.login_week,b.first_week as first_week from
(SELECT
user_id,
week(login_date) AS login_week
FROM login
GROUP BY user_id,week(login_date)) a,
(SELECT
user_id,
min(week(login_date)) AS first_week
FROM login
GROUP BY user_id) b
where a.user_id=b.user_id;
+---------+------------+------------+
| user_id | login_week | first_week |
+---------+------------+------------+
| 2 | 1 | 1 |
| 9 | 1 | 1 |
| 10 | 0 | 0 |
| 10 | 1 | 0 |
| 10 | 2 | 0 |
| 10 | 4 | 0 |
| 11 | 0 | 0 |
| 12 | 0 | 0 |
| 12 | 2 | 0 |
| 12 | 3 | 0 |
| 13 | 1 | 1 |
| 13 | 3 | 1 |
| 14 | 3 | 3 |
| 14 | 4 | 3 |
| 15 | 0 | 0 |
| 15 | 2 | 0 |
| 15 | 3 | 0 |
| 15 | 4 | 0 |
| 16 | 1 | 1 |
| 16 | 3 | 1 |
| 16 | 4 | 1 |
| 18 | 2 | 2 |
| 18 | 4 | 2 |
| 20 | 3 | 3 |
| 21 | 1 | 1 |
| 21 | 3 | 1 |
+---------+------------+------------+
4. Oblicz numer tygodnia
Od tego momentu łatwo jest obliczyć wskaźnik retencji w SQL. Następnie obliczamy różnicę między login_week i first_week, aby obliczyć week_number (liczbę tygodni)
mysql> select a.user_id,a.login_week,b.first_week as first_week,
a.login_week-first_week as week_number from
(SELECT
user_id,
week(login_date) AS login_week
FROM login
GROUP BY user_id,week(login_date)) a,
(SELECT
user_id,
min(week(login_date)) AS first_week
FROM login
GROUP BY user_id) b
where a.user_id=b.user_id;
+---------+------------+------------+-------------+
| user_id | login_week | first_week | week_number |
+---------+------------+------------+-------------+
| 2 | 1 | 1 | 0 |
| 9 | 1 | 1 | 0 |
| 10 | 0 | 0 | 0 |
| 10 | 1 | 0 | 1 |
| 10 | 2 | 0 | 2 |
| 10 | 4 | 0 | 4 |
| 11 | 0 | 0 | 0 |
| 12 | 0 | 0 | 0 |
| 12 | 2 | 0 | 2 |
| 12 | 3 | 0 | 3 |
| 13 | 1 | 1 | 0 |
| 13 | 3 | 1 | 2 |
| 14 | 3 | 3 | 0 |
| 14 | 4 | 3 | 1 |
| 15 | 0 | 0 | 0 |
| 15 | 2 | 0 | 2 |
| 15 | 3 | 0 | 3 |
| 15 | 4 | 0 | 4 |
| 16 | 1 | 1 | 0 |
| 16 | 3 | 1 | 2 |
| 16 | 4 | 1 | 3 |
| 18 | 2 | 2 | 0 |
| 18 | 4 | 2 | 2 |
| 20 | 3 | 3 | 0 |
| 21 | 1 | 1 | 0 |
| 21 | 3 | 1 | 2 |
+---------+------------+------------+-------------+
5. Obróć wynik
Na koniec musimy przestawić wynik, obliczyć wskaźnik retencji w SQL i wygenerować tabelę kohortową. W naszej tabeli przestawnej będziemy mieć jeden wiersz na każdy pierwszy_tydzień wartość i jedna kolumna na każdy week_number zawierające liczbę użytkowników, którzy wrócili po „n” tygodniach do korzystania z Twojego produktu/usługi. W tym celu używamy następującego zapytania.
mysql> select first_week,
SUM(CASE WHEN week_number = 0 THEN 1 ELSE 0 END) AS week_0,
SUM(CASE WHEN week_number = 1 THEN 1 ELSE 0 END) AS week_1,
SUM(CASE WHEN week_number = 2 THEN 1 ELSE 0 END) AS week_2,
SUM(CASE WHEN week_number = 3 THEN 1 ELSE 0 END) AS week_3,
SUM(CASE WHEN week_number = 4 THEN 1 ELSE 0 END) AS week_4,
SUM(CASE WHEN week_number = 5 THEN 1 ELSE 0 END) AS week_5,
SUM(CASE WHEN week_number = 6 THEN 1 ELSE 0 END) AS week_6,
SUM(CASE WHEN week_number = 7 THEN 1 ELSE 0 END) AS week_7,
SUM(CASE WHEN week_number = 8 THEN 1 ELSE 0 END) AS week_8,
SUM(CASE WHEN week_number = 9 THEN 1 ELSE 0 END) AS week_9
from (
select a.user_id,a.login_week,b.first_week as first_week,a.login_week-first_week as week_number from (SELECT
user_id,
week(login_date) AS login_week
FROM login
GROUP BY user_id,week(login_date)) a,(SELECT
user_id,
min(week(login_date)) AS first_week
FROM login
GROUP BY user_id) b
where a.user_id=b.user_id
) as with_week_number
group by first_week
order by first_week;
+------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| first_week | week_0 | week_1 | week_2 | week_3 | week_4 | week_5 | week_6 | week_7 | week_8 | week_9 |
+------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| 0 | 4 | 1 | 3 | 2 | 2 | 0 | 0 | 0 | 0 | 0 |
| 1 | 5 | 0 | 3 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
Teraz wiemy, jak obliczyć wskaźnik retencji w SQL. Możesz również wykonać powyższe zapytania, aby obliczyć współczynnik retencji w MySQL, PostgreSQL.
Na koniec możesz użyć narzędzia do wizualizacji danych, aby wykreślić powyższą analizę kohorty retencji w tabeli. Oto tabela przechowywania kohorty utworzona za pomocą Ubiq.

Przy okazji, jeśli chcesz tworzyć tabele przestawne, wykresy i dashboardy z bazy danych MySQL, możesz wypróbować Ubiq. Oferujemy 14-dniowy bezpłatny okres próbny.