Maison > base de données > tutoriel mysql > Comment compter les lignes précédentes dans une plage de temps dans PostgreSQL ?

Comment compter les lignes précédentes dans une plage de temps dans PostgreSQL ?

Susan Sarandon
Libérer: 2024-12-19 16:14:13
original
573 Les gens l'ont consulté

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

Compter les lignes précédentes dans une plage de temps

Dans PostgreSQL, vous pouvez déterminer le nombre total d'enregistrements précédents dans une plage de temps donnée pour chaque ligne à l'aide des fonctions de fenêtre.

Utilisation de RANGE dans les fonctions de fenêtre (Postgres 11 ou plus récent)

Pour Postgres 11 ou version ultérieure, le mode RANGE vous permet de spécifier la plage horaire à l'aide des options PRECEDING et EXCLUDE :

SELECT id, ts
, count(*) OVER (ORDER BY ts RANGE '1 hour' PRECEDING EXCLUDE CURRENT ROW)
FROM test
ORDER BY ts;
Copier après la connexion

Anciennes versions de PostgreSQL

Pour les versions antérieures de PostgreSQL, d'autres approches sont recommandé :

Requête de Roman (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;
Copier après la connexion

Comptage de tableaux (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;
Copier après la connexion

Fonction PL/pgSQL (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$;
Copier après la connexion

Appelez la fonction avec l'intervalle de temps souhaité :

SELECT * FROM running_window_ct('1 hour');
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal