PostgreSQL: Berechnung einer laufenden Zeilenanzahl pro Minute
In diesem Artikel wird gezeigt, wie Sie in PostgreSQL eine nach Minuten gruppierte laufende Zeilenanzahl für eine Abfrage erhalten. Die Herausforderung besteht darin, die Zeilen für jede Minute genau zu zählen, auch solche ohne Aktivität.
Fensterfunktionen nutzen
Die effizienteste Lösung nutzt die leistungsstarken Fensterfunktionen von PostgreSQL. Diese Funktionen arbeiten mit Zeilensätzen und ermöglichen Berechnungen über mehrere Zeilen hinweg. Hier verwenden wir die Funktion COUNT
innerhalb eines nach Minuten unterteilten Fensters.
Effiziente Abfrage mit SELECT DISTINCT
und ORDER BY
Diese Abfrage verwendet SELECT DISTINCT
, um eindeutige Minuteneinträge sicherzustellen, und COUNT
mit einer Fensterfunktion, um die laufende Zählung zu generieren. ORDER BY
garantiert die korrekte kumulative Summe für jedes Minutenintervall.
<code class="language-sql">SELECT DISTINCT date_trunc('minute', "when") AS minute, count(*) OVER (ORDER BY date_trunc('minute', "when")) AS running_ct FROM mytable ORDER BY 1;</code>
Verstehen der Fensterfunktionssyntax
Lassen Sie uns die Fensterfunktion aufschlüsseln:
COUNT(*)
: Zählt Zeilen innerhalb jeder Minutenpartition.OVER (ORDER BY date_trunc('minute', "when"))
: Definiert das Fenster als eine Folge von Zeilen, geordnet nach Minuten, wobei die Anzahl vom Anfang an akkumuliert wird.Verwaltung von Minuten ohne Aktivität
Um Minuten ohne Aktivität (null Zeilen) einzuschließen, verwenden wir generate_series
, um eine Reihe von Minuten zu erstellen, und führen dann einen LEFT JOIN
aus, um diese Minuten einzubeziehen, auch wenn ihnen entsprechende Einträge in der Tabelle fehlen:
<code class="language-sql">SELECT DISTINCT minute, count(c.minute) OVER (ORDER BY minute) AS running_ct FROM ( SELECT generate_series(date_trunc('minute', min("when")), max("when"), interval '1 min') FROM mytable ) m(minute) LEFT JOIN (SELECT date_trunc('minute', "when") AS minute FROM mytable) c USING (minute) ORDER BY 1;</code>
Leistungsüberlegungen
Während Fensterfunktionen im Allgemeinen für große Datensätze optimal sind, bietet eine Alternative mit SUM()
bei kleineren Datensätzen möglicherweise eine bessere Leistung. Bei diesem Ansatz werden zunächst Zeilen pro Minute gruppiert und gezählt und anschließend mit SUM()
die laufende Summe berechnet:
<code class="language-sql">SELECT minute, sum(minute_ct) OVER (ORDER BY minute) AS running_ct FROM ( SELECT date_trunc('minute', "when") AS minute, count(*) AS minute_ct FROM tbl GROUP BY 1 ) sub ORDER BY 1;</code>
Der beste Ansatz hängt von der Größe Ihres Datensatzes und Ihren Leistungsanforderungen ab. Es wird empfohlen, beide Methoden zu testen, um die effizienteste Lösung für Ihren spezifischen Anwendungsfall zu ermitteln.
Das obige ist der detaillierte Inhalt vonWie erhalte ich in PostgreSQL eine laufende Zeilenanzahl pro Minute?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!