Ankündigung

Einklappen
Keine Ankündigung bisher.

statistik: anzhal der user gruppiert nach monat

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • statistik: anzhal der user gruppiert nach monat

    Hallo,
    ich brauche eine Abfrage (in MySQL) mit der ich die Anzahl der User für verschiedene MOnate ermittel.
    z.B.
    UserID, Registrierdatum
    1, 01.01.2010
    2, 01.02.2010
    3, 01.03.2010

    Ich möchte nun eine Abfrage erstellen, die mir sagt, dass in Monat 01/2010 1 User registriert war, in Monat 2/2010: 2User und in Monat 03/2010: 3 User.

    Wenn ich einfach "Group by Month(Registrierdatum)" nehme, tacht User 1 nur im Monat 01/2010 auf, und nicht in den nachfolgenden Monaten.
    Bekommt man das in einer Abfrage hin, oder muss ich für jeden Monat einzel ein SQL-Statement starten?


  • #2
    Welchen Datentyp hat denn die Spalte Registrierdatum?

    Kommentar


    • #3
      Zitat von ChrisB Beitrag anzeigen
      Welchen Datentyp hat denn die Spalte Registrierdatum?
      Timestamp

      statt "Group by Month(Registrierdatum)" schreibe ich sowas wie (Group by Month(Registrierdatum), Year(Registrierdatum)". Aber damit erhalte ich ja nur die "Neuanmeldungen"

      Kommentar


      • #4
        Zitat von waldaux Beitrag anzeigen
        Ich möchte nun eine Abfrage erstellen, die mir sagt, dass in Monat 01/2010 1 User registriert war, in Monat 2/2010: 2User und in Monat 03/2010: 3 User.
        Dafür ist GROUP BY natürlich nicht geeignet.

        Deine Datensätze enthalten diese Information ja auch nur indirekt - für User 1 gibt es im Monat 02/2010 schließlich gar keinen.

        Kommentar


        • #5
          Code:
          SELECT count(*), YEAR(RegDatum) AS year, MONTH(RegDatum) AS month FROM user GROUP BY YEAR(RegDatum), MONTH(RegDatum)
          Damit solltest du für jeden Monat die Anzahl an neu registrierten Usern bekommen.

          Wenn ich einfach "Group by Month(Registrierdatum)" nehme, tacht User 1 nur im Monat 01/2010 auf, und nicht in den nachfolgenden Monaten.
          Wenn ich das richtig deute, willst du allerdings für jeden Monat die Anzahl von allen bis dahin registrierten Usern haben. Wenn das wirklich der Fall ist wirds kompliziert, da wirst du um Subqueries nicht herrum kommen, glaub ich.

          Kommentar


          • #6
            warum so kompliziert?

            Mit SELECT COUNT(*) und einer bis zwei Datumsangaben in der WHERE-Klausel kannst du mit einer Abfrage für jeden beliebigen Zeitraum die Anzahl der angemeldeten User ermitteln.

            Kommentar


            • #7
              Zitat von ACO Beitrag anzeigen
              warum so kompliziert?

              Mit SELECT COUNT(*) und einer bis zwei Datumsangaben in der WHERE-Klausel kannst du mit einer Abfrage für jeden beliebigen Zeitraum die Anzahl der angemeldeten User ermitteln.
              Und wenn du die Daten jetzt für jeden Monat haben willst führst du für jeden Monat einen Query aus? Nicht besonders sinnvoll!

              Kommentar


              • #8
                Ja, ich soll aber eine Statistik erstellen, in der viele Zeiträume angezeigt werden. So müsste ich für jeden zeitraum ein SQL-Statement starten.

                ich dachte an sowas in der art:
                Code:
                Select count(*), daten.*
                from user u inner join 
                (
                	select max(timestamp) as timestamp from user u group by Month(timestamp), Year(timestamp) 
                ) daten on daten.timestamp < u.timestamp 
                group by daten.timestamp
                Edith:

                Ok, ich glaub ich habs:
                Code:
                Select count(*), daten.*
                from user u inner join 
                (
                	select max(timestamp) as timestamp from user u 
                	group by Month(u.timestamp), Year(u.timestamp) 
                
                ) daten on daten.timestamp >= u.timestamp 
                group by daten.timestamp
                ist aber alles andere als performant

                Kommentar


                • #9
                  Da dein Eingangsbeispiel nicht angibt, ob gelöschte User noch mitgezählt werden sollen oder nicht, hier mal ein anderer Vorschlag:

                  Code:
                  SELECT MAX(UserID) FROM tabelle GROUP BY (passende Registrierungsmonatumwandlungsformel)
                  Mit While und fetch bekommst du dann für alle Monate die jeweils höchste User-ID, was identisch ist mit der Anzahl der insgesamt registrierten User bis zum jeweils passenden Datum.

                  Kommentar


                  • #10
                    Zitat von ACO Beitrag anzeigen
                    die jeweils höchste User-ID, was identisch ist mit der Anzahl der insgesamt registrierten User
                    Kids: Please don't try this at home ...

                    Das wäre ein ganz grober Fehler, die ID für so etwas zu missbrauchen.

                    Kommentar


                    • #11
                      Zitat von waldaux Beitrag anzeigen
                      Edith:

                      Ok, ich glaub ich habs:
                      Code:
                      Select count(*), daten.*
                      from user u inner join 
                      (
                      	select max(timestamp) as timestamp from user u 
                      	group by Month(u.timestamp), Year(u.timestamp) 
                      
                      ) daten on daten.timestamp >= u.timestamp 
                      group by daten.timestamp
                      ist aber alles andere als performant
                      Die Performance von diesem Statement ist doch eigentlich gar nicht so wichtig, wenn du die Statstik für jeden Monat brauchst musst du das Statement auch nur 1mal im Monat ausführen (Cronjob o.ä) das ergebniss kannst du dann einfach Cachen.

                      Kommentar

                      Lädt...
                      X