在 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 分开了统计值。合并它们直到正确输出。
我需要在单个 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 分开了统计值。合并它们直到正确输出。