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

Forøgelse af MySQL-forespørgselsydeevne - Math tung forespørgsel

Jeg tror, ​​at dette vil give dig, hvad du ønsker, med uanset et rullende datointerval, du er bekymret for... Jeg har testet ved at oprette min egen "faktura"-tabel med de to kolonner identificeret. Det var faktisk ret simpelt med brugen af ​​@ mySQL-variabler, der kan bruges inline i forespørgslen... Det eneste er, at der nu er en sand måde at vide, hvad en "åbnings"-balance er, så jeg har indstillet initialen startværdien nul, og juster derefter fra det.

Kickeren er "PreAgg"-forespørgslen til blot at aggregere efter selve datoen for ind/ud. Så, ved at bestille dette resultat i datorækkefølge, starter @ sql-variablen.

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

Men selvom jeg har givet et 3 måneders vindue (-2 måneder, +1 måned), synes jeg ikke det giver rigtig mening, da de fremtidige opslag ikke vil være sket endnu... hvad der kan være vigtigere er at bare have

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

som vil få de sidste 3 måneder fra nuværende dato/tidspunkt.



  1. Mysql count vs mysql SELECT, hvilken er hurtigere?

  2. PHP-kodningsfejl ved fremstilling af XML fra database

  3. Sådan fungerer FLOOR() i MariaDB

  4. 5 måder at rette fejlen "Del med nul" i SQL Server (Msg 8134)