sql >> Database >  >> RDS >> Mysql

MySQL-aggregatie per maand met lopend totaal

Helaas biedt MySQL geen analytische functies, zoals Oracle en SQL Server.

Een manier om een ​​"lopend totaal" te krijgen is door gebruik te maken van een gebruikersvariabele, zoiets als dit:

  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

OPMERKING:Het gedrag van geheugenvariabelen zoals hierboven gebruikt, is in deze context niet gegarandeerd. Maar als we voorzichtig zijn met de query, kunnen we voorspelbare, herhaalbare resultaten krijgen in SELECT-instructies. Het gedrag van geheugenvariabelen kan in een toekomstige release veranderen, waardoor deze aanpak onwerkbaar wordt.

OPMERKING:ik heb uw zoekopdracht in feite tussen haakjes geplaatst en een alias gegeven als een inline-weergave (wat MySQL een "afgeleide tabel" noemt). Ik heb een paar wijzigingen aangebracht in uw zoekopdracht, uw GROUP BY heeft het potentieel om januari 2012 te groeperen met januari vanaf 2013, dat heb ik gewijzigd. Ik heb ook een ORDER BY-clausule toegevoegd.




  1. MySQL-databasefout:constante, willekeurige of tijdzoneafhankelijke expressies in de (sub)partitioneringsfunctie zijn niet toegestaan

  2. Transactiereplicatie maken

  3. Wat is het maximum aantal tekens voor de NVARCHAR(MAX)?

  4. De eigenschap ConnectionString is niet geïnitialiseerd fout