Maison >base de données >tutoriel mysql >Comment la clause « KEEP » affecte-t-elle « PARTITION BY » dans les requêtes Oracle Aggregate ?
PARTITION BY avec et sans KEEP dans Oracle
Dans Oracle, la clause PARTITION BY permet de partitionner les données en groupes distincts à cet effet d'appliquer des fonctions d'agrégation. Il est souvent avantageux de partitionner les données pour optimiser les performances ou pour un regroupement logique.
La clause PARTITION BY peut être utilisée avec ou sans le mot-clé KEEP. Lorsque KEEP n'est pas utilisé, la partition entière est utilisée pour l'agrégation. En revanche, lorsque KEEP est utilisé, seules les lignes qui répondent à une condition spécifique sont conservées pour l'agrégation.
Pour illustrer la différence, considérons les deux requêtes suivantes :
Requête 1 sans KEEP :
SELECT deptno, MIN(sal) OVER (PARTITION BY deptno) AS "Lowest", MAX(sal) OVER (PARTITION BY deptno) AS "Highest" FROM empl
Requête 2 avec KEEP :
SELECT deptno, MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS "Lowest", MAX(sal) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) AS "Highest" FROM empl
La requête 2 utilise la clause KEEP pour renvoyer uniquement les premiers et derniers salaires classés pour chaque département (en utilisant la fonction DENSE_RANK). L'effet global est d'éliminer les valeurs en double et de fournir des salaires minimum et maximum distincts.
Pour élaborer davantage :
Dans la deuxième requête, le MIN et le DENSE_RANK FIRST sont appliqués à la colonne sal, ce qui entraîne un comportement identique. Par conséquent, la clause KEEP est redondante dans ce scénario. Cependant, si une colonne différente était utilisée pour calculer le minimum, comme le nom, la clause KEEP deviendrait pertinente.
Par exemple :
MIN(name) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno)
Cette requête renverrait le nom correspondant à le salaire le plus bas pour chaque département, à l'exclusion des noms en double associés au même salaire minimum.
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!