您可以使用窗口函数MIN来确定每个用户的最早订阅日期并进行比较以确定他们是否是新用户。然后,您可以对此进行汇总/求和,以确定每年和每月的新订阅或续订数量。
SELECT
YEAR(`Date`) as `year`,
MONTH(`Date`) as `month`,
SUM(is_new=true) as `new subscriptions`,
SUM(is_new=false) as `renewals`
FROM (
SELECT
*,
`Date`=MIN(`Date`) OVER (PARTITION BY `User_id`) as is_new
FROM
events
WHERE
`Event`='NEW'
) e
GROUP BY
YEAR(`Date`),
MONTH(`Date`)
ORDER BY
YEAR(`Date`),
MONTH(`Date`);
| 年 |
月 |
新订阅 |
续约 |
| 2021 |
8 |
2 |
0 |
| 2021 |
9 |
0 |
1 |
或者,如果您使用不支持窗口函数的 mysql 版本,您可以对找到最早订阅日期的子查询执行左连接。使用相同的逻辑,我们可以确定和计算新订阅和续订的数量。
SELECT
YEAR(`Date`) as `year`,
MONTH(`Date`) as `month`,
SUM(new_sub.min_date IS NOT NULL) as `new subscriptions`,
SUM(new_sub.min_date IS NULL) as `renewals`
FROM
events e
LEFT JOIN (
SELECT
`User_id`,
MIN(`Date`) as min_date
FROM
events
WHERE
`Event`='NEW'
GROUP BY
`User_id`
) as new_sub ON e.`User_id`=new_sub.`User_id` AND
e.`Date`=new_sub.min_date
GROUP BY
YEAR(`Date`),
MONTH(`Date`)
ORDER BY
YEAR(`Date`),
MONTH(`Date`)
| 年 |
月 |
新订阅 |
续约 |
| 2021 |
8 |
2 |
0 |
| 2021 |
9 |
0 |
1 |
在 DB Fiddle 上查看工作演示
让我知道这是否适合您。