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

Aumentando o desempenho da consulta MySQL - consulta pesada de matemática


Eu acho que isso vai te dar o que você quer com um intervalo de datas contínuo com o qual você está preocupado... Eu testei criando minha própria tabela "fatura" com as duas colunas identificadas. Na verdade, foi bastante simples com a utilização de variáveis ​​@ mySQL que podem ser usadas inline na consulta ... A única coisa é que agora existe uma maneira verdadeira de saber o que é um saldo "abertura", então configurei o valor inicial valor de inicialização de zero, em seguida, ajuste a partir disso.

O kicker é a consulta "PreAgg" para agregar apenas pela própria data de entrada/saída. Então, ordenando esse resultado em ordem de data, a variável @sql entra em ação.
select
      PreAgg.PostDate,
      @PrevBal as BegBal,
      PreAgg.OutFlows,
      PreAgg.InFlows,
      @PrevBal := @PrevBal + PreAgg.OutFlows + PreAgg.InFlows as EndBal
   from 
      ( select
              i.postdate,
              sum( if( i.amount < 0, i.amount, 0 ) ) as OutFlows,
              sum( if( i.amount > 0, i.amount, 0 ) ) as InFlows
           from 
              invoice i
           where
              i.postdate between date_sub( now(), interval 2 month )
                             and date_add( now(), interval 1 month )
           group by
              i.postdate
           order by 
              i.postdate ) as PreAgg,
      ( select @PrevBal := 0.00 ) as SqlVars

No entanto, mesmo que eu tenha dado uma janela de 3 meses (-2 meses, +1 mês), não acho que isso realmente faça sentido, pois as postagens futuras ainda não terão acontecido ... o que pode ser mais importante é basta ter
       where
          i.postdate > date_sub( now(), interval 3 month )

que obterá os últimos 3 meses a partir da data/hora atual.