Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Erhöhen der Leistung von MySQL-Abfragen - Mathelastige Abfrage

Ich denke, das wird Ihnen das bringen, was Sie wollen, mit einem rollierenden Datumsbereich, mit dem Sie sich befassen ... Ich habe getestet, indem ich meine eigene "Rechnungs" -Tabelle mit den beiden identifizierten Spalten erstellt habe. Mit der Verwendung von @ mySQL-Variablen, die inline in der Abfrage verwendet werden können, war es eigentlich ganz einfach ... Das einzige ist, dass es jetzt einen wahren Weg gibt, um zu wissen, was ein "Eröffnungssaldo" ist, also habe ich den Anfangswert gesetzt Startwert von Null, dann davon abgleichen.

Der Kicker ist die "PreAgg"-Abfrage, um nur nach dem Datum selbst von In/Out zu aggregieren. Dann, indem Sie dieses Ergebnis in Datumsreihenfolge anordnen, tritt die @ SQL-Variable in Kraft.

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

Obwohl ich ein 3-Monats-Fenster angegeben habe (-2 Monate, +1 Monat), denke ich nicht, dass das wirklich Sinn macht, da die zukünftigen Postings noch nicht stattgefunden haben ... was vielleicht wichtiger ist, ist zu habe nur

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

die die letzten 3 Monate ab dem aktuellen Datum/der aktuellen Uhrzeit erhält.