Heim > Datenbank > MySQL-Tutorial > Wie erhalte ich in PostgreSQL eine laufende Zeilenanzahl pro Minute?

Wie erhalte ich in PostgreSQL eine laufende Zeilenanzahl pro Minute?

Mary-Kate Olsen
Freigeben: 2025-01-19 00:42:09
Original
743 Leute haben es durchsucht

How to Get a Running Row Count by Minute in PostgreSQL?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage