PostgreSQL: Anzahl der Zeilen für eine Abfrage "pro Minute"
Ich brauche die Abfrage für jede minute, die Gesamtzahl der Zeilen bis zu dieser minute.
Die besten, die ich erreichen konnte bislang nicht den trick tun. Es gibt Zähler pro minute, nicht die Gesamtzahl, bis zu jeder minute:
SELECT COUNT(id) AS count
, EXTRACT(hour from "when") AS hour
, EXTRACT(minute from "when") AS minute
FROM mytable
GROUP BY hour, minute
InformationsquelleAutor der Frage GabiMe | 2011-11-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur zurück, Minuten mit Aktivität
Kürzeste
Verwenden
date_trunc()
es gibt genau das, was Sie brauchen.Nicht
id
in der Abfrage, da will manGROUP BY
- minute-Scheiben.count()
wird normalerweise verwendet, als nur Aggregatfunktion. Anhängen einerOVER
Klausel macht es einen Fensterfunktion. WeglassenPARTITION BY
im Fenster definition - Sie wollen eine laufende Zählung über alle Zeilen. Standardmäßig zählt von der ersten Zeile an die Letzte peer von der aktuellen Zeile, definiert durchORDER BY
. Ich zitiere das Handbuch:- Und das passiert zur genauwas Sie brauchen.
Verwenden
count(*)
eher alscount(id)
. Besser passt deine Frage ("Anzahl der Zeilen"). Es ist im Allgemeinen etwas schneller alscount(id)
. Und während wir annehmen, daßid
istNOT NULL
es wurde nicht angegeben in Frage, und socount(id)
ist falschstreng genommen, da NULL-Werte nicht gezählt, mitcount(id)
.Können Sie nicht
GROUP BY
- minute-Scheiben an der gleichen query-Ebene. Aggregatfunktionen angewendet werden vor Fenster Funktionen der Fenster-Funktioncount(*)
nur 1 Zeile pro minute auf diese Weise.Sie können jedoch
SELECT DISTINCT
, weilDISTINCT
angewendet wird nach Fenster-Funktionen.ORDER BY 1
ist nur ein Kürzel fürORDER BY date_trunc('minute', "when")
hier.1
ist ein positions-Referenz an den 1. Ausdruck in derSELECT
Liste.Verwenden
to_char()
wenn Sie brauchen, um format das Ergebnis. Wie:Schnellste
Ähnlich wie die oben genannten, aber:
Ich eine Unterabfrage verwenden, zu aggregieren und zählen der Zeilen pro minute. Auf diese Weise erhalten wir 1 Zeile pro minute ohne
DISTINCT
im äußerenSELECT
.Verwenden
sum()
als window-Aggregat-Funktion hinzufügen, bis die Grafen von der Unterabfrage.Ich fand, dass dies wesentlich schneller mit vielen Zeilen pro minute.
Gehören Minuten ohne Aktivität
Kürzeste
@GabiMe fragte in einem Kommentar , wie man eone Zeile für jeder
minute
im Zeitrahmen, einschließlich derjenigen, in denen kein Ereignis stattgefunden hat (keine Zeile in der Basistabelle):Erzeugen, die eine Zeile für jede minute in der Zeitspanne zwischen der ersten und der letzten Veranstaltung mit
generate_series()
- hier direkt auf Basis der aggregierten Werte aus der Unterabfrage.LEFT JOIN
alle Zeitstempel abgeschnitten, um die Minuten und zählen.NULL
Werte (wo es keine Zeile vorhanden ist) nicht hinzufügen, um die laufende Zählung.Schnellste
Mit CTE:
Wieder, zu aggregieren und zählen der Zeilen pro minute im ersten Schritt, es wird die Notwendigkeit für später
DISTINCT
.Anders aus
count()
sum()
zurückkehren könnenNULL
. Standardmäßig0
mitCOALESCE
.Mit vielen Zeilen und einer index auf
"when"
diese version mit einer Unterabfrage war Sie die Schnellste unter ein paar Varianten getestet habe ich mit Postgres 9.1 - 9.4:InformationsquelleAutor der Antwort Erwin Brandstetter