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
Susan SarandonOriginal
2024-12-19 16:14:13662Durchsuche

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;

Ä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;

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;

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$;

Funktion mit dem gewünschten Zeitintervall aufrufen:

SELECT * FROM running_window_ct('1 hour');

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!

Stellungnahme:
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