Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menghimpun dan Mengagregat Nilai Angka Berjujukan dalam PostgreSQL Menggunakan Subqueries?

Bagaimana untuk Menghimpun dan Mengagregat Nilai Angka Berjujukan dalam PostgreSQL Menggunakan Subqueries?

Patricia Arquette
Patricia Arquetteasal
2025-01-09 13:26:42645semak imbas

How to Group and Aggregate Sequential Numeric Values in PostgreSQL Using Subqueries?

Menghimpun dan mengagregatkan nilai berangka berterusan menggunakan subkueri dalam PostgreSQL

Apabila berurusan dengan jadual yang mengandungi data berangka, selalunya perlu untuk mengumpulkan dan mengagregatkan nilai mengikut susunannya. Dalam PostgreSQL 9.0 dan ke atas, anda boleh menggunakan gabungan subkueri untuk mencapai ini.

Kenal pasti nilai tidak berterusan

Langkah pertama ialah mengenal pasti nilai bukan berturut-turut dalam medan angka sasaran. Ini boleh dilakukan dengan subkueri yang memberikan setiap baris kiraan kumpulan dan menetapkan semula pembilang apabila nilai tidak berturut-turut berlaku.

<code class="language-sql">SELECT company, profession, year,
       CASE
           WHEN row_number() OVER (PARTITION BY company, profession ORDER BY year) = 1
               OR year - lag(year, 1, year) OVER (PARTITION BY company, profession ORDER BY year) > 1
           THEN 1
           ELSE 0
       END AS group_cnt
FROM qualification;</code>

Tentukan ID kumpulan

Seterusnya, kami mencipta ID kumpulan untuk setiap jujukan nilai yang berturut-turut. Ini melibatkan subkueri lain yang menjumlahkan kiraan kumpulan daripada subkueri sebelumnya.

<code class="language-sql">SELECT company, profession, year,
       SUM(group_cnt) OVER (ORDER BY company, profession, year) AS group_nr
FROM (
    SELECT company, profession, year,
           CASE
               WHEN row_number() OVER (PARTITION BY company, profession ORDER BY year) = 1
                   OR year - lag(year, 1, year) OVER (PARTITION BY company, profession ORDER BY year) > 1
               THEN 1
               ELSE 0
           END AS group_cnt
    FROM qualification
) t1;</code>

Penggabungan akhir

Akhir sekali, kami mengagregatkan nilai untuk setiap kumpulan menggunakan ID kumpulan.

<code class="language-sql">SELECT company, profession, array_agg(year) AS years
FROM (
    SELECT company, profession, year,
           SUM(group_cnt) OVER (ORDER BY company, profession, year) AS group_nr
    FROM (
        SELECT company, profession, year,
               CASE
                   WHEN row_number() OVER (PARTITION BY company, profession ORDER BY year) = 1
                       OR year - lag(year, 1, year) OVER (PARTITION BY company, profession ORDER BY year) > 1
                   THEN 1
                   ELSE 0
               END AS group_cnt
        FROM qualification
    ) t1
) t2
GROUP BY company, profession, group_nr
ORDER BY company, profession, group_nr;</code>

Pertanyaan ini akan mengembalikan jadual yang mengandungi gabungan syarikat dan pekerjaan yang unik, dengan nilai tahun dikumpulkan ke dalam tatasusunan berdasarkan susunan berangkanya. Kaedah ini secara berkesan mengumpulkan jujukan berangka berterusan untuk memudahkan analisis dan pemprosesan seterusnya.

Atas ialah kandungan terperinci Bagaimana untuk Menghimpun dan Mengagregat Nilai Angka Berjujukan dalam PostgreSQL Menggunakan Subqueries?. 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