PARTITION BY avec et sans KEEP dans Oracle
La clause PARTITION BY dans Oracle vous permet de regrouper des lignes dans une table et d'effectuer des fonctions d'agrégation sur ces groupes. La clause KEEP, lorsqu'elle est utilisée avec la clause PARTITION BY, vous permet de spécifier les lignes à conserver lors du calcul de la fonction d'agrégation.
Considérez les deux requêtes suivantes :
SELECT empno, deptno, sal, MIN(sal) OVER (PARTITION BY deptno) "Lowest", MAX(sal) OVER (PARTITION BY deptno) "Highest" FROM empl SELECT empno, deptno, sal, MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) "Lowest", MAX(sal) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) "Highest" FROM empl
Les deux requêtes semblent pour avoir le même résultat : ils calculent les salaires les plus bas et les plus élevés pour chaque département. Cependant, il existe une différence subtile entre les deux requêtes.
Dans la première requête, les fonctions MIN et MAX sont appliquées à toutes les lignes de chaque partition. Dans la deuxième requête, la clause KEEP est utilisée pour spécifier que seules les première et dernière lignes de chaque partition doivent être incluses dans le calcul.
La clause KEEP peut être utilisée avec n'importe quelle fonction d'agrégation. Elle est particulièrement utile lorsque vous souhaitez rechercher la première ou la dernière occurrence d'une valeur dans un ensemble de lignes.
Par exemple, la requête suivante recherche le prénom et le nom des employés ayant les salaires les plus élevés dans chaque service. :
SELECT empno, deptno, sal, MIN(name) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS "First Highest Salary", MAX(name) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) AS "Last Highest Salary" FROM empl GROUP BY deptno
La clause KEEP peut également être utilisée pour optimiser les performances. En spécifiant que seules la première ou la dernière ligne de chaque partition doivent être incluses dans le calcul, vous pouvez réduire la quantité de données que la base de données doit traiter. Cela peut améliorer les performances de votre requête, surtout si vous travaillez avec un grand ensemble de données.
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!