Maison >base de données >tutoriel mysql >Comment regrouper et agréger des valeurs numériques consécutives dans PostgreSQL à l'aide de GROUP BY ?
PostgreSQL 9.0 et versions ultérieures peuvent agréger des valeurs numériques consécutives dans un champ spécifique à l'aide de la clause GROUP BY
. La requête suivante montre comment y parvenir dans une table contenant les champs entreprise, profession et année :
Étape 1 : Identifier les valeurs non continues
<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>
Cette requête attribue un nombre de groupes (group_cnt) à chaque ligne selon que les années sont consécutives ou non. Une ligne avec group_cnt 1 indique le début d'un nouveau groupe.
Étape 2 : Définir l'ID du groupe
<code class="language-sql">-- 步骤二:定义分组 ID SELECT company, profession, year, SUM(group_cnt) OVER (ORDER BY company, profession, year) AS group_nr FROM qualification WHERE group_cnt = 1;</code>
Cette requête attribue un numéro de groupe (group_nr) à chaque groupe. Chaque année consécutive appartient au même groupe.
Étape 3 : Agréger les années consécutives
<code class="language-sql">-- 步骤三:聚合连续年份 SELECT company, profession, ARRAY_AGG(year) AS years FROM qualification WHERE group_cnt <> 0 GROUP BY company, profession, group_nr ORDER BY company, profession, group_nr;</code>
Cette requête finale regroupe les années consécutives dans un tableau et filtre les lignes non consécutives. Les résultats sont regroupés par entreprise et par profession.
En suivant les trois étapes ci-dessus, vous pouvez agréger efficacement des valeurs continues dans PostgreSQL. Notez que la table qualification
doit être remplacée par le nom réel de votre table.
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!