0

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

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

今年丢失的用户 - 在特定年份内拥有“archive_date”(DATETIME)字段的用户。

用户计数- 可以通过“注册”(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

示例数据数据库小提琴: https ://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=0f79c8fb40b6c1185908f91ce39d6251

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

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

代码应该适用于 MySQL 5.7。

4

1 回答 1

1
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 (%)是否正确......所以我返回单独的统计值。组合它们直到正确的输出。

于 2021-12-15T11:16:24.010 回答