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

Løbende samlet over datointerval - udfyld de manglende datoer

For at tage højde for manglende måneder skal du oprette en skabelontabel, som du kan deltage i.

Tænk på det som caching. I stedet for at gå igennem og udfylde huller, skal du bare have en kalender cachelagret i din database.

Du kan endda kombinere flere kalendere (begyndelsen af ​​måneden, starten af ​​ugen, helligdage, arbejdsdage osv.) i én tabel med en masse søgeflag og indekser.

Du ender med noget som...

SELECT
  calendar.date,
  SUM(data.amt)
FROM
  calendar
LEFT JOIN
  data
    ON  data.date >= calendar.date
    AND data.date <  calendar.date + INTERVAL 1 MONTH
WHERE
      calendar.date >= '20110101'
  AND calendar.date <  '20120101'
GROUP BY
  calendar.date

REDIGER

Jeg har lige bemærket, at OP ønsker en løbende total.

Dette -er- muligt i SQL, men det er ekstremt ineffektiv. Årsagen er, at resultatet fra en måned ikke bruges til at beregne den følgende måned. I stedet skal hele den løbende sum beregnes igen.

Af denne grund anbefales det normalt kraftigt, at du beregner den månedlige total som ovenfor, og derefter bruger din applikation til at gå igennem og lave de løbende samlede værdier.

Hvis du virkelig skal gøre det i SQL, ville det være noget i stil med...

SELECT
  calendar.date,
  SUM(data.amt)
FROM
  calendar
LEFT JOIN
  data
    ON  data.date >= @yourFirstDate
    AND data.date <  calendar.date + INTERVAL 1 MONTH
WHERE
      calendar.date >= @yourFirstDate
  AND calendar.date <  @yourLastDate
GROUP BY
  calendar.date


  1. Fremmednøgler i MySQL?

  2. Sådan overvåger du MySQL-containere med Prometheus - Implementering på Standalone og Swarm::Første del

  3. MySQL-heltalssammenligning ignorerer efterfølgende alfategn

  4. Importer CSV-fil i Oracle Table ved hjælp af lagret procedure