Mysql
 sql >> Base de données >  >> RDS >> Mysql

Augmentation des performances de la requête MySQL - Requête lourde en mathématiques

Je pense que cela vous donnera ce que vous voulez, quelle que soit la plage de dates qui vous intéresse... J'ai testé en créant ma propre table "facture" avec les deux colonnes identifiées. C'était en fait assez simple avec l'utilisation de variables @ mySQL qui peuvent être utilisées en ligne dans la requête ... La seule chose est qu'il existe maintenant un véritable moyen de savoir ce qu'est un solde "d'ouverture", j'ai donc défini le initial valeur de démarrage de zéro, puis ajustez à partir de cela.

Le kicker est la requête "PreAgg" pour simplement agréger par la date elle-même d'entrée/sortie. Ensuite, en ordonnant ce résultat par ordre de date, la variable @ sql entre en jeu.

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

Cependant, même si j'ai donné une fenêtre de 3 mois (-2 mois, +1 mois), je ne pense pas que cela ait vraiment de sens car les futures affectations n'auront pas encore eu lieu... ce qui peut être plus important est de avoir juste

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

qui obtiendra les 3 derniers mois à partir de la date/heure actuelle.