Heim > Datenbank > MySQL-Tutorial > Wie zähle ich vorherige Zeilen innerhalb eines Zeitbereichs in PostgreSQL?

Wie zähle ich vorherige Zeilen innerhalb eines Zeitbereichs in PostgreSQL?

Susan Sarandon
Freigeben: 2024-12-19 16:14:13
Original
598 Leute haben es durchsucht

How to Count Previous Rows Within a Time Range in PostgreSQL?

Vorherige Zeilen innerhalb eines Zeitbereichs zählen

In PostgreSQL können Sie für jeden die Gesamtzahl der vorhergehenden Datensätze innerhalb eines bestimmten Zeitbereichs ermitteln Zeile mit Fensterfunktionen.

Verwendung von RANGE in Fensterfunktionen (Postgres 11 oder neuer)

Für Postgres 11 oder höher können Sie im RANGE-Modus den Zeitbereich mithilfe der Optionen PRECEDING und EXCLUDE angeben:

SELECT id, ts
, count(*) OVER (ORDER BY ts RANGE '1 hour' PRECEDING EXCLUDE CURRENT ROW)
FROM test
ORDER BY ts;
Nach dem Login kopieren

Ältere PostgreSQL-Versionen

Für frühere Versionen von PostgreSQL gibt es andere Ansätze empfohlen:

Roman's Query (ROM)

SELECT id, ts
, (SELECT count(*)::int - 1
FROM unnest(dates) x
WHERE x >= sub.ts - interval '1h') AS ct
FROM (
SELECT id, ts
, array_agg(ts) OVER (ORDER BY ts) AS dates
FROM test
) sub;
Nach dem Login kopieren

Array Counting (ARR)

SELECT id, ts
, (SELECT count(*)
FROM test t1
WHERE t1.ts >= t.ts - interval '1h'
AND t1.ts < t.ts) AS ct
FROM test t
ORDER BY ts;
Nach dem Login kopieren

PL/pgSQL-Funktion (FNC)

CREATE OR REPLACE FUNCTION running_window_ct(_intv interval = '1 hour')
RETURNS TABLE (id bigint, ts timestamp, ct int) AS
$func$
DECLARE
cur CURSOR FOR
SELECT t.ts + _intv AS ts1
, row_number() OVER (ORDER BY t.ts ROWS UNBOUNDED PRECEDING) AS rn
FROM test t
ORDER BY t.ts;
rec record;
rn int;
BEGIN
OPEN cur;
FETCH cur INTO rec;
ct := -1;

FOR id, ts, rn IN
SELECT t.id, t.ts, row_number() OVER (ORDER BY t.ts ROWS UNBOUNDED PRECEDING)
FROM test t ORDER BY t.ts
LOOP
IF rec.ts1 >= ts THEN
ct := ct + 1;
ELSE
LOOP
FETCH cur INTO rec;
EXIT WHEN rec.ts1 >= ts;
END LOOP;
ct := rn - rec.rn;
END IF;

RETURN NEXT;
END LOOP;
END
$func$;
Nach dem Login kopieren

Funktion mit dem gewünschten Zeitintervall aufrufen:

SELECT * FROM running_window_ct('1 hour');
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie zähle ich vorherige Zeilen innerhalb eines Zeitbereichs in PostgreSQL?. 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