Maison >base de données >tutoriel mysql >Comment générer un nombre de lignes en cours dans PostgreSQL pour chaque minute, y compris les minutes inactives ?

Comment générer un nombre de lignes en cours dans PostgreSQL pour chaque minute, y compris les minutes inactives ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-19 01:02:12976parcourir

PostgreSQL : Générer un nombre de lignes en cours par minute, y compris les périodes inactives

Cet article montre comment générer un nombre courant de lignes dans une table PostgreSQL pour chaque minute, même si certaines minutes n'ont aucune activité.

How to Generate a Running Row Count in PostgreSQL for Each Minute, Including Inactive Minutes?

Méthode 1 : compte courant pour les minutes actives uniquement

Cette approche utilise des fonctions de fenêtre pour calculer un décompte pour chaque minute où une activité existe :

<code class="language-sql">SELECT DISTINCT
       date_trunc('minute', "when") AS minute,
       count(*) OVER (ORDER BY date_trunc('minute', "when")) AS running_count
FROM   mytable
ORDER  BY 1;</code>

date_trunc('minute', "when") regroupe les lignes par minute. La fonction count(*) OVER (ORDER BY date_trunc('minute', "when")) fournit un total cumulé classé par minute.

Méthode 2 : inclure les minutes inactives

Pour inclure les minutes sans activité, nous utilisons generate_series pour créer une séquence de minutes complète et un LEFT JOIN pour incorporer les décomptes :

<code class="language-sql">WITH cte AS (
   SELECT date_trunc('minute', "when") AS minute, COUNT(*) AS minute_ct
   FROM   mytable
   GROUP  BY 1
)
SELECT m.minute, COALESCE(sum(cte.minute_ct) OVER (ORDER BY m.minute), 0) AS running_count
FROM  (
   SELECT generate_series(min(minute), max(minute), interval '1 min') AS minute
   FROM   cte
) m
LEFT   JOIN cte USING (minute)
ORDER  BY 1;</code>

Un CTE (cte) regroupe les lignes par minute et les compte. generate_series crée une série de minutes couvrant toute la plage horaire. Le LEFT JOIN combine cette série avec les décomptes de cte, et COALESCE gère les minutes sans activité en attribuant un décompte courant de 0. Le sum() OVER (ORDER BY m.minute) calcule ensuite la somme cumulée.

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!

Déclaration:
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