sql >> Base de Datos >  >> RDS >> Mysql

Aumento del rendimiento de MySQL Query:consulta matemática pesada

Creo que esto le dará lo que quiere, sin embargo, con un rango de fechas móviles que le preocupan ... Lo probé creando mi propia tabla de "facturas" con las dos columnas identificadas. En realidad, fue bastante simple con la utilización de variables @ mySQL que se pueden usar en línea en la consulta... Lo único es que ahora hay una forma real de saber qué es un saldo de "apertura", así que configuré el saldo inicial valor inicial de cero y luego ajustar a partir de eso.

El truco es la consulta "PreAgg" para agregar simplemente por la fecha de entrada/salida. Luego, al ordenar ese resultado por orden de fecha, se activa la variable @ sql.

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

Sin embargo, a pesar de que he dado una ventana de 3 meses (-2 meses, +1 mes), no creo que realmente tenga sentido ya que las publicaciones futuras aún no habrán sucedido... lo que puede ser más importante es solo tienes

       where
          i.postdate > date_sub( now(), interval 3 month )

que obtendrá los últimos 3 meses a partir de la fecha/hora actual.