Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengira Kiraan Baris Larian setiap Minit dengan Cekap dalam PostgreSQL?

Bagaimana untuk Mengira Kiraan Baris Larian setiap Minit dengan Cekap dalam PostgreSQL?

Patricia Arquette
Patricia Arquetteasal
2025-01-19 00:46:10721semak imbas

How to Efficiently Calculate Running Row Counts per Minute in PostgreSQL?

Kaedah pengiraan yang cekap bagi kiraan baris seminit dalam PostgreSQL

Dapatkan kiraan baris

<code class="language-sql">SELECT COUNT(id) AS count,
       EXTRACT(hour FROM "when") AS hour,
       EXTRACT(minute FROM "when") AS minute
FROM mytable
GROUP BY hour, minute;</code>

Pertanyaan ini mengira baris seminit tetapi tidak memberikan jumlah berjalan.

Dapatkan kiraan larian

Kaedah 1: Hanya kembalikan minit dengan rekod aktiviti

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

Pertanyaan ini menggunakan fungsi date_trunc() untuk mengembalikan kiraan baris bagi setiap minit aktif. Ia mengira jumlah bilangan larian menggunakan fungsi tetingkap dengan klausa ORDER BY.

Mengandungi minit tanpa aktiviti

Kaedah 2: Gunakan subquery dengan join

<code class="language-sql">SELECT minute, sum(minute_ct) OVER (ORDER BY minute) AS running_ct
FROM  (
   SELECT date_trunc('minute', "when") AS minute,
          count(*) AS minute_ct
   FROM   tbl
   GROUP  BY 1
   ) sub
ORDER  BY 1;</code>

Kaedah ini mengagregatkan kiraan baris seminit dalam subkueri. Pertanyaan utama kemudian bergabung dengannya untuk mengumpul kiraan dan memasukkan minit tanpa aktiviti.

Kaedah 3: Gunakan CTE (paling cepat)

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

Kaedah ini menggabungkan CTE, subquery dan left join. Ini adalah pendekatan yang cekap untuk set data besar dengan indeks "bila".

Atas ialah kandungan terperinci Bagaimana untuk Mengira Kiraan Baris Larian setiap Minit dengan Cekap dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn