Ich habe einige Schwierigkeiten mit mySQL-Befehlen, die ich ausführen möchte.
SELECT a.timestamp, name, count(b.name)
FROM time a, id b
WHERE a.user = b.user
AND a.id = b.id
AND b.name = 'John'
AND a.timestamp BETWEEN '2010-11-16 10:30:00' AND '2010-11-16 11:00:00'
GROUP BY a.timestamp
Dies ist meine aktuelle Ausgabeanweisung.
timestamp name count(b.name)
------------------- ---- -------------
2010-11-16 10:32:22 John 2
2010-11-16 10:35:12 John 7
2010-11-16 10:36:34 John 1
2010-11-16 10:37:45 John 2
2010-11-16 10:48:26 John 8
2010-11-16 10:55:00 John 9
2010-11-16 10:58:08 John 2
Wie gruppiere ich sie in 5-Minuten-Intervallergebnisse?
Ich möchte, dass meine Ausgabe so ist
timestamp name count(b.name)
------------------- ---- -------------
2010-11-16 10:30:00 John 2
2010-11-16 10:35:00 John 10
2010-11-16 10:40:00 John 0
2010-11-16 10:45:00 John 8
2010-11-16 10:50:00 John 0
2010-11-16 10:55:00 John 11
Antworten:
Dies funktioniert mit jedem Intervall.
PostgreSQL
MySQL
quelle
Ich bin auf das gleiche Problem gestoßen.
Ich fand heraus, dass es einfach ist, nach Minutenintervallen zu gruppieren, indem man die Epoche in Minuten in Minuten teilt und dann entweder rundet oder den Boden verwendet, um den Rest zu fahren. Wenn Sie also ein Intervall von 5 Minuten erhalten möchten, würden Sie 300 Sekunden verwenden .
Dadurch werden die Daten korrekt nach dem ausgewählten Minutenintervall gruppiert zurückgegeben. Es werden jedoch keine Intervalle zurückgegeben, die keine Daten enthalten. Um diese leeren Intervalle zu erhalten, können wir die Funktion generate_series verwenden .
Ergebnis:
Um nun das Ergebnis mit einem Intervall von null Vorkommen zu erhalten, verbinden wir beide Ergebnismengen nur von außen .
Das Endergebnis enthält die Serie mit allen 5-Minuten-Intervallen, auch ohne Intervalle.
Das Intervall kann leicht geändert werden, indem der letzte Parameter von generate_series angepasst wird. In unserem Fall verwenden wir '5m', aber es kann jedes gewünschte Intervall sein .
quelle
Sie sollten lieber
GROUP BY UNIX_TIMESTAMP(time_stamp) DIV 300
anstelle von round (../ 300) verwenden, da ich festgestellt habe, dass einige Datensätze in zwei gruppierte Ergebnismengen gezählt werden.quelle
DIV
MySQLfloor()
eine Float-Abteilung, die mitBIGINT
s sicher ist .Für Postgres fand ich es einfacher und genauer, die zu verwenden
date_trunc
Funktion, wie:
Sie können verschiedene Auflösungen wie 'Minute', 'Stunde', 'Tag' usw. für date_trunc angeben.
quelle
5
hier für das 5-Minuten-Intervall ein?Die Abfrage lautet wie folgt:
quelle
Sie müssen wahrscheinlich Ihren Zeitstempel in ymd: HM aufteilen und DIV 5 verwenden, um die Minuten in 5-Minuten-Bins aufzuteilen - so etwas wie
... und futz dann die Ausgabe im Client-Code so, dass sie so aussieht, wie Sie es möchten. Sie können auch die gesamte Datumszeichenfolge mit dem SQL Concat-Operator erstellen, anstatt separate Spalten abzurufen, wenn Sie möchten.
... und dann gruppieren
quelle
Ich bin mir nicht sicher, ob du es noch brauchst.
quelle
Wie wäre es mit diesem:
quelle
Ich fand heraus, dass mit MySQL wahrscheinlich die richtige Abfrage die folgende ist:
Lass mich wissen was du denkst.
quelle
quelle