我正在尝试计算在一定时期内每个组中活跃的用户数。使用while循环,该周期将递增1个月。
代码正在运行,但仅显示2017年1月的结果。这很奇怪,原因有两个: 1.我认为代码将显示所有结果 2. @end_date中存储的日期是2019年6月的某个时间
我对第一个问题感到怀疑的是,代码正在运行,但仅显示一次迭代的结果。
第二个问题我不知道为什么会这样
我想我将需要实现一个临时表,或另一个通过拱形选择循环。但是我不确定哪个是更好的选择,或者是否还有更好的方法。
DELIMITER $$
CREATE PROCEDURE Active_Users()
BEGIN
SELECT CAST('2016-01-01 00:00:00' AS DATETIME) INTO @period_start;
SELECT CAST('2016-02-01 00:00:00' AS DATETIME) INTO @period_end;
SELECT CAST( MAX(created_at) AS DATETIME) FROM account_group INTO @end_date;
WHILE (@period_start <= @end_date) DO
SELECT
YEAR(@period_start) as xyear,
MONTH(@period_start) as xmonth,
g.name,
COUNT(a.id) as num_in_period
INTO #temptable
FROM accounts a
JOIN account_group ag
ON a.id = ag.account_id
JOIN groups g
ON ag.group_id = g.id
WHERE ag.created_at <= @period_start AND ((CAST(ag.deleted_at as DATETIME) >= @period_start AND CAST(ag.deleted_at as DATETIME) <= @period_end) OR ag.deleted_at is null)
GROUP BY xyear, xmonth, g.name;
SELECT DATE_ADD(@period_start, INTERVAL 1 MONTH) INTO @period_start;
SELECT DATE_ADD(@period_end, INTERVAL 1 MONTH) INTO @period_end;
END WHILE;
END $$
DELIMITER ;
结果将是每个时期每个组中所有用户的计数,例如。
--------------------------------
| year | month | group | count |
--------------------------------
| 2016 | 1 | grp A | 10 |
| 2016 | 1 | grp B | 15 |
| 2016 | 2 | grp A | 14 |
| 2016 | 2 | grp B | 12 |
| ... | ... | ... | ... |
| 2019 | 6 | grp B | 243 |