Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL agregado por mês com total em execução


Infelizmente, o MySQL não fornece funções analíticas, como o Oracle e o SQL Server fazem.

Uma maneira de obter um "total em execução" é usar uma variável de usuário, algo assim:
  SELECT t.Date
       , t.NewUsers
       , @rt := @rt + t.NewUsers AS `Running Total`
    FROM (SELECT @rt := 0) i
    JOIN (
           SELECT DATE_FORMAT(created,'%Y%m%d') AS `Date`
                , COUNT(item_id) as `NewUsers`
             FROM AP_user
            WHERE YEAR(created) > 2011
              AND user_groups = '63655'
              AND user_active = 1
              AND userID NOT IN $excludedUsers
            GROUP BY DATE_FORMAT(created,'%Y-%m')
            ORDER BY DATE_FORMAT(created,'%Y-%m') ASC
         ) t

NOTA:O comportamento das variáveis ​​de memória como usado acima não é garantido neste contexto. Mas se formos cuidadosos com a consulta, podemos obter resultados previsíveis e repetíveis em instruções SELECT. O comportamento das variáveis ​​de memória pode mudar em uma versão futura, tornando essa abordagem impraticável.

NOTA:Eu basicamente envolvi sua consulta entre parênteses e dei a ela um alias como uma visualização em linha (o que o MySQL chama de "tabela derivada"). Fiz algumas alterações na sua consulta, seu GROUP BY tem potencial para agrupar janeiro de 2012 com janeiro de 2013, alterei isso. Eu também adicionei uma cláusula ORDER BY.