给定的EventLog表有userid列和ds列.这代表给定用户在"网站"上发生的所有事件.

样本数据:

userid ds
user1 2022-01-01
user2 2022-02-11
user2 2022-03-21
user3 2022-01-11
user3 2022-02-27
user3 2022-04-06

我需要从表中最早的月份开始计算每月保留曲线.如果用户在给定月份内没有执行操作(没有eventLog年的记录),则被视为离职.

这就是我try 过的:

SELECT DATE_FORMAT(ds, '%Y-%m-01') as ds_month
      ,COUNT(DISTINCT userid) * 1.0 / COUNT(*) as retention_rate
FROM eventLog
GROUP BY DATE_FORMAT(ds, '%Y-%m-01')

这是小提琴:http://sqlfiddle.com/#!9/f6bdefc/4

我得到了以下输出:

enter image description here

预期结果为:

month retention_rate Reasoning
2022-01-01 100% This is 100% by definition - user1 and user3 did the first action during this month
2022-02-01 66% 2 / 3 users retained (user2 did the first action, user3 retained, user1 churned)
2022-03-01 33% 1 / 3 users retained (user2 retained, user1 and user3 churned)
2022-04-01 33% 1 / 3 users retained (user3 retained, user1 and user2 churned)

推荐答案

诀窍是将表中的COUNT(DISTINCT userid)除以total个不同的用户数;子查询可以做到这一点:SELECT COUNT(DISTINCT userid) FROM eventLog.将其与IF语句结合使用,以判断2022-01-01是否作为返回100%的值存在(如果我正确理解了您的逻辑).

SELECT 
  DATE_FORMAT(ds, '%Y-%m-01') as ds_month,
  CONCAT(FLOOR(IF(DATE_FORMAT(ds, '%Y-%m-01') = DATE_FORMAT(ds, '%Y-01-01'),100,(COUNT(DISTINCT userid)*100.0)/(SELECT COUNT(DISTINCT userid) FROM eventLog))),'%') AS user_count
FROM eventLog
GROUP BY DATE_FORMAT(ds, '%Y-%m-01')

Result:

| ds_month   | user_count  |
|------------|-------------|
| 2022-01-01 | 100%        |
| 2022-02-01 | 66%         |
| 2022-03-01 | 33%         |
| 2022-04-01 | 33%         |

我使用FLOOR()函数是因为您返回了66%,而不是2022-02-0167%.如果需要,您可以使用FORMAT(column, 0)(或您想要的任何小数位)将2022-02-01适当地向上舍入到67%.

Fiddle 100.

Mysql相关问答推荐

MySQL在带有特定属性值上的对象的数组的杨森对象中搜索

MariaDB字段+1

使用Check查看过go 两个月是否完成了IRM Meetup

MySQL match against给出奇怪的结果

看不懂mysql自左连接查询

我在连接到 mysql 的 node js 中收到错误消息发送到客户端后无法设置标头

如何找到每个user_id每个产品的买家类型数量?

Mysql时间序列数据的最小值和最大值

生成直到 10 的平方数序列

拆分列值并适当地返回拆分值

MySQL 在第一个匹配行后停止搜索 N 行(不是 LIMIT)

如何在 axios 请求中将更新的设置状态值作为参数传递

0000-00-00 00:00:00 表中的日期设置为 NOT NULL

此插页中的X是什么> X'3C2F756C3E'

如何使用 C++ 连接 mySQL 数据库

MySQL时区更改?

有没有办法在 Zend Framework 1.5 中执行INSERT...ON DUPLICATE KEY UPDATE?

第 1 行的 CSV 输入中的列数无效错误

获得上个月的第一天和最后一天的最佳方式?

MySQL讲解查询理解