查找多个期间的日期之间的记录计数-WHILE LOOP

时间:2019-07-11 02:25:18

标签: mysql

我正在尝试计算在一定时期内每个组中活跃的用户数。使用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  |

0 个答案:

没有答案