sql >> Databáze >  >> RDS >> Database

Jak vypočítat míru retence v SQL?

Míra udržení je definována jako počet zákazníků, kteří nadále používají produkt/službu. Je obtížné vypočítat kohortovou retenční analýzu. Zde je návod, jak vypočítat míru udržení v SQL pro analýzu udržení zákazníků. Můžete jej použít k výpočtu míry retence v MySQL, PostgreSQL, SQL Server a Oracle. Podíváme se také na SQL dotaz pro udržení zákazníků. Míra udržení se měří jako počet vracejících se uživatelů v pravidelných intervalech, například každý týden nebo měsíc, seskupených podle týdne jejich registrace.

Vypočteme udržení podle týdenní kohorty v SQL a skončíme s tabulkou jako je ta níže, která ukazuje počet zákazníků, kteří se znovu přihlásili po první registraci před několika týdny, za každý týden registrace.

Jak vypočítat míru uchování v SQL?

Zde jsou kroky k výpočtu míry uchování v SQL. Řekněme, že máte následující tabulku, která ukládá user_id a login_date návštěvy každého uživatele.

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 |
+------------+---------+----+

Budeme vytvářet týdenní kohortovou analýzu. V závislosti na vašem produktu/službě jej můžete změnit na měsíční/denní.

K výpočtu míry retence v SQL budeme používat MySQL. Můžete také vypočítat míru odchodu pro PostgreSQL.

1. Počet návštěv za týden

Abychom vypočítali míru udržení v SQL, nejprve seskupíme každou návštěvu podle týdne přihlášení.

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 |
+---------+------------+

Podívejte se také na Jak vypočítat týdenní aktivní uživatele (WAU) v MySQL.

2. Vypočítejte PRVNÍ TÝDEN přihlášení pro každého uživatele

Dále, abychom mohli vypočítat míru udržení v SQL, musíme vypočítat první týden přihlášení pro každého uživatele. Jednoduše použijeme funkci MIN a GROUP BY pro výpočet prvního týdne přihlášení pro každého uživatele

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. Sloučit 2 tabulky pro login_week a first_week

Dále získáme login_week a first_week vedle sebe pro každého uživatele pomocí níže uvedeného dotazu s INNER JOIN, abychom vypočítali míru udržení v 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. Vypočítat číslo týdne

Od této chvíle je snadné vypočítat míru retence v SQL. Dále vypočítáme rozdíl mezi login_week a first_week, abychom vypočítali week_number (počet týdne)

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. Otočte výsledek

Nakonec musíme výsledek otočit, vypočítat míru uchování v SQL a vygenerovat tabulku kohorty. V naší kontingenční tabulce budeme mít jeden řádek pro každý první_týden hodnotu a jeden sloupec pro každé číslo_týdne obsahující počet uživatelů, kteří se po ‚n‘ týdnech mohou vrátit k používání vašeho produktu/služby. K tomu používáme následující dotaz.

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 |
+------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+

Nyní víme, jak vypočítat míru retence v SQL. Výše uvedené dotazy můžete také vypočítat retenci v MySQL, PostgreSQL.

Nakonec můžete použít nástroj pro vizualizaci dat k vykreslení výše uvedené kohortové analýzy retence do tabulky. Zde je tabulka uchování kohorty vytvořená pomocí Ubiq.

Mimochodem, pokud chcete vytvářet kontingenční tabulky, grafy a dashboardy z databáze MySQL, můžete zkusit Ubiq. Nabízíme 14denní bezplatnou zkušební verzi.

  1. Jaký je rozdíl mezi Scope_Identity(), Identity(), @@Identity a Ident_Current()?

  2. Jak najít poslední den v měsíci pro dané datum v MySQL

  3. ScaleGrid zvyšuje akciové kolo růstu od Spotlight Equity Partners s cílem urychlit expanzi a dále investovat do produktového plánu

  4. ekvivalentní datové typy mysql