Maison >base de données >tutoriel mysql >Comment la clause « KEEP » affecte-t-elle « PARTITION BY » dans Oracle Aggregate Functions ?

Comment la clause « KEEP » affecte-t-elle « PARTITION BY » dans Oracle Aggregate Functions ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-29 21:06:21399parcourir

How Does the `KEEP` Clause Affect `PARTITION BY` in Oracle Aggregate Functions?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn