2016-04-02 15 views
0

Ich versuche, eine Abfrage zu erstellen, um die durchschnittliche Anzahl der Musikstücke pro Sendung Stunde für einen bestimmten Tag zu finden.Zählen Sie die Anzahl der Elemente pro Stunde, dann finden Sie den Durchschnitt des Ergebnisses

Ich habe eine Tabelle, die protokolliert, wenn ein Track gespielt wurde, basierend auf einem Datetime-Wert (erzeugtes Feld).

Also ich muss zählen, wie viele Einträge oder Tracks, die pro Stunde protokolliert wurden.

Dann mit den stündlichen Summen, finden Sie den Durchschnitt.

Bisher habe ich das, aber fragte mich, ob es richtig ist?

SELECT AVG(a.total) FROM (
    SELECT HOUR(created) AS hour, COUNT(id) AS total 
    FROM `music_log` r 
    WHERE DATE(created) = DATE(DATE_SUB(NOW() , INTERVAL 1 DAY)) group by HOUR(r.created) 
) a 

Ich gebe bekam, formulierte ich aus einem anderen Beitrag auf Stackoverflow, dass und nicht verstehen, was die ein und r Mittelwert/Referenz.

Ich würde gerne wissen, ob ich dieses Recht habe, so kann ich Abfrage erweitern, um ein Viertel (3 Monate) Ergebnisse zu decken.

+0

Sieht ziemlich gut aus. Beachten Sie, dass DATE (created) keinen Index verwenden kann. A und r sind Aliase. R ist nicht unbedingt notwendig, aber a ist. – Strawberry

+0

Oh richtig. So erstellt kann kein Index in der Tabelle sein. Ist das richtig? Ich hatte vorher keine Probleme. – mattauckland

+0

erstellt kann indiziert werden. DATE() kann diesen Index nicht nutzen. Wenn es möglich ist (und manchmal auch nicht), ist es besser, die Abfrage so zu schreiben, dass der Index verwendet werden kann, z. : 'WHERE erstellt BETWEEN '2016-04-02 00:00:00' UND '2016-04-02 23: 59: 59';' – Strawberry

Antwort

0

Wie Erdbeere sagt, es sieht so aus, als ob ich auf dem richtigen Weg bin. Danke Erdbeere.

Um dies zu erweitern, und nur für den Fall, dass es jemand anderen hilft, habe ich die Abfrage auf ein Viertel, in diesem Fall das erste Quartal des laufenden Jahres zu decken .... er sagt, dass es nichts anderes ist falsch mit Meine Frage :)

Um es richtig zu berechnen, musste ich die stündlichen Ergebnisse nach Datum und Stunde gruppieren.

In der vorherigen Abfrage in der Frage wurde nur nach Stunde gruppiert. Das ist in Ordnung, wenn die Durchschnittsberechnung nur einen einzigen Tag überschreitet. Wenn Sie diese jedoch über einen Tag hinaus erweitern, werden die Ergebnisse falsch. Dies liegt daran, dass es beispielsweise die Summe beider Vorkommen von 23 Uhr addiert und dann den Durchschnitt berechnet.

Hoffnung, das hilft ... oder wenn ich einen Fehler gemacht habe, ich hoffe, dass jemand auf sie abholt;)

1

Sie den Mittelwert ohne Unterabfrage berechnen kann:

SELECT COUNT(*)/COUNT(DISTINCT DATE(created), HOUR(created)) as average 
FROM `music_log` 
WHERE QUARTER(created) = 1 AND YEAR(created) = YEAR(NOW()) ; 

berechnet daraus die Gesamtanzahl und die Anzahl der Stunden, ohne dass eine Unterabfrage erforderlich ist.

Verwandte Themen