在 SQL 请求中获取按年分组的用户流失率

Get users churn rate grouped by years in SQL request

我需要在单个 SQL 请求中获取按年份和用户类型分组的用户流失率值。

流失率=今年流失的用户数(已存档)/(今年年初的用户数+今年注册的用户数)

今年流失的用户 - 在特定年份内具有 'archive_date' (DATETIME) 字段的用户。

用户数 - 可以通过 'registered' (DATETIME) 字段计算。

我需要将此数据按数据库中存在的所有年份(用户注册日期)分组,并按用户类型分组。

预期结果(仅示例):

year  |  user_type  |  churn_rate
2019  |  A          |  32
2019  |  B          |  20
2019  |  C          |  15
2020  |  A          |  52
2020  |  B          |  45
... etc years and user types

样本数据数据库fiddle: https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=0f79c8fb40b6c1185908f91ce39d6251

例如对于此示例 fiddle 在 2020 年注册了 1 个新用户,我们在 2020 年初有 2 个用户(他们是在 2019 年注册的),我们在 2020 年有 1 个用户存档,所以(如果我们不按用户类型分组)2020 年的总体流失率将为:

流失率 = 1 / (2 + 1) = 0.33(33% 流失率)

代码应适用于 MySQL 5.7.

SELECT year_reg,
       SUM(YEAR(registered) < year_reg AND (YEAR(archive_date) > year_reg OR archive_date IS NULL)) AS reg_before,
       SUM(YEAR(registered) = year_reg) AS reg_cur,
       SUM(YEAR(archive_date) = year_reg) AS arch_cur,
       SUM(YEAR(archive_date) = year_reg) / (SUM(YEAR(registered) < year_reg AND (YEAR(archive_date) > year_reg OR archive_date IS NULL)) / SUM(YEAR(registered) = year_reg)) churn_rate
FROM users
CROSS JOIN (SELECT DISTINCT YEAR(registered) year_reg
            FROM users) years_list
GROUP BY year_reg

https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=7c289b8f88c1fe57870229965615d97c

PS。我不确定您 Churn rate (%) 的公式是否正确...所以我 return 分开了统计值。合并它们直到正确输出。