ホームページ >データベース >mysql チュートリアル >PostgreSQL で非アクティブな分を含む分ごとの実行行数を生成するにはどうすればよいですか?

PostgreSQL で非アクティブな分を含む分ごとの実行行数を生成するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-19 01:02:12906ブラウズ

PostgreSQL: 非アクティブな期間を含む分単位の実行行数の生成

この記事では、数分間アクティビティがなかった場合でも、PostgreSQL テーブル内の行数を分単位で生成する方法を説明します。

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

方法 1: アクティブな分のみの実行カウント

このアプローチでは、ウィンドウ関数を使用してアクティビティが存在する分ごとの実行カウントを計算します。

<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") は行を分ごとにグループ化します。 count(*) OVER (ORDER BY date_trunc('minute', "when")) 関数は、分単位で並べ替えられた累計を提供します。

方法 2: 非アクティブな時間を含める

アクティビティがゼロの分を含めるには、generate_series を使用して完全な分のシーケンスを作成し、LEFT JOIN を使用してカウントを組み込みます。

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

CTE (cte) は行を分ごとにグループ化し、カウントします。 generate_series は、時間範囲全体にわたる一連の分を作成します。 LEFT JOIN は、この系列を cte からのカウントと結合し、COALESCE は実行カウント 0 を割り当てることでアクティビティのない分を処理します。sum() OVER (ORDER BY m.minute) は累積合計を計算します。

以上がPostgreSQL で非アクティブな分を含む分ごとの実行行数を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。