sql >> Databasteknik >  >> RDS >> Mysql

Ökad MySQL Query-prestanda - Math tung fråga

Jag tror att detta kommer att ge dig vad du vill med hur ett rullande datumintervall du än är intresserad av... Jag har testat genom att skapa min egen "faktura"-tabell med de två kolumnerna identifierade. Det var faktiskt ganska enkelt med användningen av @mySQL-variabler som kan användas inline i frågan... Det enda är att det nu finns ett riktigt sätt att veta vad ett "öppningssaldo" är, så jag har ställt in den initiala startvärdet noll och justera sedan från det.

Kickern är "PreAgg"-frågan för att bara aggregera efter själva datumet för in/ut. Sedan, genom att ordna resultatet i datumordning, startar @ sql-variabeln.

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 även om jag har gett ett 3 månaders fönster (-2 månader, +1 månad), tycker jag inte att det är riktigt vettigt eftersom de framtida inläggen inte kommer att ha hänt än... vad som kan vara viktigare är att bara ha

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

som kommer att få de senaste 3 månaderna från aktuellt datum/tid.



  1. Hur kan jag beskriva en tabell i Oracle utan att använda kommandot DESCRIBE?

  2. MySQL auto-inkrement per distinkt värde angett i annan kolumn?

  3. Övervaka MySQL-inlägg från olika applikationer

  4. SQL ersätter alla NULL