Mysql
 sql >> Database >  >> RDS >> Mysql

Aumento delle prestazioni di MySQL Query - Query matematiche pesanti

Penso che questo ti otterrà ciò che desideri con un intervallo di date mobile di cui sei interessato ... Ho testato creando la mia tabella "fattura" con le due colonne identificate. In realtà è stato abbastanza semplice con l'utilizzo di variabili @ mySQL che possono essere utilizzate in linea nella query ... L'unica cosa è che ora esiste un vero modo per sapere cos'è un saldo "di apertura", quindi ho impostato l'iniziale valore di avvio pari a zero, quindi regola da quello.

Il kicker è la query "PreAgg" per aggregare semplicemente in base alla data stessa di entrata/uscita. Quindi, ordinando il risultato in ordine di data, entra in gioco la variabile @ 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

Tuttavia, anche se ho concesso una finestra di 3 mesi (-2 mesi, +1 mese), non credo che abbia davvero senso in quanto i futuri post non saranno ancora avvenuti... ciò che potrebbe essere più importante è basta avere

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

che otterrà gli ultimi 3 mesi dalla data/ora corrente.