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

MySQL aggregiert nach Monat mit laufender Summe

Leider bietet MySQL keine analytischen Funktionen wie Oracle und SQL Server.

Eine Möglichkeit, eine "laufende Summe" zu erhalten, besteht darin, eine Benutzervariable zu verwenden, etwa so:

  SELECT t.Date
       , t.NewUsers
       , @rt := @rt + t.NewUsers AS `Running Total`
    FROM (SELECT @rt := 0) i
    JOIN (
           SELECT DATE_FORMAT(created,'%Y%m%d') AS `Date`
                , COUNT(item_id) as `NewUsers`
             FROM AP_user
            WHERE YEAR(created) > 2011
              AND user_groups = '63655'
              AND user_active = 1
              AND userID NOT IN $excludedUsers
            GROUP BY DATE_FORMAT(created,'%Y-%m')
            ORDER BY DATE_FORMAT(created,'%Y-%m') ASC
         ) t

HINWEIS:Das Verhalten von Speichervariablen wie oben verwendet wird in diesem Zusammenhang nicht garantiert. Aber wenn wir mit der Abfrage vorsichtig sind, können wir vorhersagbare, wiederholbare Ergebnisse in SELECT-Anweisungen erhalten. Das Verhalten von Speichervariablen kann sich in einer zukünftigen Version ändern, wodurch dieser Ansatz nicht mehr funktioniert.

HINWEIS:Ich habe Ihre Abfrage im Grunde in Klammern gesetzt und ihr einen Alias ​​​​als Inline-Ansicht gegeben (was MySQL eine "abgeleitete Tabelle" nennt). Ich habe ein paar Änderungen an Ihrer Abfrage vorgenommen, Ihre GROUP BY hat das Potenzial, Januar 2012 zusammen mit Januar von 2013 zu gruppieren, das habe ich geändert. Ich habe auch eine ORDER BY-Klausel hinzugefügt.