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

Comment la clause « KEEP » affecte-t-elle « PARTITION BY » dans les requêtes Oracle Aggregate ?

Mary-Kate Olsen
Libérer: 2025-01-05 04:06:44
original
200 Les gens l'ont consulté

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

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
Copier après la connexion

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
Copier après la connexion

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 :

  • OVER (PARTITION BY deptno) : partitionne le données basées sur la colonne deptno.
  • ORDER BY sal : trie les lignes de chaque partition par salaire par ordre croissant.
  • KEEP (DENSE_RANK FIRST) : Conserve uniquement la première ligne classée pour chaque partition. La fonction DENSE_RANK attribue des rangs consécutifs uniques aux lignes, avec des valeurs identiques partageant le même rang.
  • MIN(sal) : calcule le salaire minimum pour les lignes retenues au sein de chaque partition.
  • MAX(sal) : calcule le salaire maximum pour les lignes conservées au sein de chaque partition.

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)
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal