Il est souvent nécessaire dans les bases de données d'extraire un nombre limité de lignes d'un groupe spécifique. Dans PostgreSQL, cette exigence peut être satisfaite en utilisant la clause LIMIT en conjonction avec des opérations de regroupement.
L'exemple suivant démontre la nécessité de récupérer les deux premières lignes (triées par colonne de nom) dans chaque groupe section_id. Par exemple, à partir du tableau donné :
<code> id | section_id | name ----+------------+------ 1 | 1 | A 2 | 1 | B 3 | 1 | C 4 | 1 | D 5 | 2 | E 6 | 2 | F 7 | 3 | G 8 | 2 | H</code>
Nous souhaitons atteindre les résultats suivants :
<code> id | section_id | name ----+------------+------ 1 | 1 | A 2 | 1 | B 5 | 2 | E 6 | 2 | F 7 | 3 | G</code>
Dans les versions de PostgreSQL antérieures à 8.4, il manquait des fonctions intégrées pour gérer efficacement de telles requêtes. Cependant, dans PostgreSQL 8.4 et versions ultérieures, une nouvelle solution a émergé :
<code class="language-sql">SELECT * FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY section_id ORDER BY name) AS r, t.* FROM xxx t ) x WHERE x.r <= 2;</code>
Cette solution utilise la fonction de fenêtre ROW_NUMBER() pour attribuer un numéro de séquence à chaque ligne de chaque partition section_id. La clause ORDER BY précise les critères de tri (nom dans ce cas). Une condition LIMIT 2 est ensuite appliquée à la sous-requête, limitant les résultats aux deux premières lignes de chaque regroupement (triés par name ).
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!