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

  • waldaux
    hat ein Thema erstellt statistik: anzhal der user gruppiert nach monat.

    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?

  • kn0wledge
    antwortet
    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.

    Einen Kommentar schreiben:


  • ChrisB
    antwortet
    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.

    Einen Kommentar schreiben:


  • ACO
    antwortet
    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.

    Einen Kommentar schreiben:


  • waldaux
    antwortet
    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

    Einen Kommentar schreiben:


  • draco88
    antwortet
    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!

    Einen Kommentar schreiben:


  • ACO
    antwortet
    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.

    Einen Kommentar schreiben:


  • draco88
    antwortet
    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.

    Einen Kommentar schreiben:


  • ChrisB
    antwortet
    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.

    Einen Kommentar schreiben:


  • waldaux
    antwortet
    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"

    Einen Kommentar schreiben:


  • ChrisB
    antwortet
    Welchen Datentyp hat denn die Spalte Registrierdatum?

    Einen Kommentar schreiben:

Lädt...
X