Maison > base de données > tutoriel mysql > En quoi la clause « PARTITION BY » d'Oracle diffère-t-elle avec et sans « KEEP » ?

En quoi la clause « PARTITION BY » d'Oracle diffère-t-elle avec et sans « KEEP » ?

Susan Sarandon
Libérer: 2024-12-21 00:45:10
original
753 Les gens l'ont consulté

How Does Oracle's `PARTITION BY` Clause Differ with and without `KEEP`?

PARTITION BY avec et sans KEEP dans Oracle

Introduction

Dans Oracle, la PARTITION La clause BY est utilisée pour diviser un ensemble de données en sous-ensembles afin d'effectuer des calculs agrégés. La clause KEEP spécifie les lignes à conserver de chaque partition. Cet article explique les différences entre l'utilisation de PARTITION BY avec et sans KEEP.

Requêtes avec et sans KEEP

Considérez les deux requêtes suivantes :

SELECT
    empno,
    deptno,
    sal,
    MIN(sal) OVER (PARTITION BY deptno) AS "Lowest",
    MAX(sal) OVER (PARTITION BY deptno) AS "Highest"
FROM
    empl;

SELECT
    empno,
    deptno,
    sal,
    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 première requête utilise PARTITION BY sans KEEP, tandis que la deuxième requête utilise KEEP (DENSE_RANK). Les deux requêtes calculent les salaires les plus bas et les plus élevés pour chaque département.

KEEP (DENSE_RANK FIRST ORDER BY sal)

Dans la deuxième requête, le KEEP (DENSE_RANK FIRST ORDER BY sal) demande à Oracle de conserver uniquement la première ligne de chaque département après avoir trié les lignes par salaire par ordre croissant. La fonction DENSE_RANK attribue un rang à chaque ligne de chaque partition, et le premier rang indique le salaire le plus bas.

Différence entre les requêtes

La deuxième requête est redondante car le MIN et le DENSE_RANK FIRST fonctionnent tous deux sur la même colonne sal. Elles produiront le même résultat que la première requête, qui calcule directement le salaire le plus bas sans utiliser KEEP.

En effet, la clause KEEP (DENSE_RANK FIRST ORDER BY sal) n'est utile que lorsque l'agrégation MIN ou MAX est effectuée sur une colonne différente de la colonne de commande. Dans de tels cas, la clause KEEP permet un contrôle plus spécifique sur les lignes incluses dans le calcul.

Exemple

Considérez la requête suivante :

SELECT
    name,
    sal,
    deptno,
    MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS "Lowest",
    MIN(name) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS "Lowest Employee"
FROM
    test;
Copier après la connexion

Cette requête calcule le salaire le plus bas pour chaque département, ainsi que le nom de l'employé avec le salaire le plus bas. La clause KEEP (DENSE_RANK FIRST ORDER BY sal) est nécessaire dans ce cas car elle garantit que seul le salaire le plus bas et le nom de l'employé correspondant sont renvoyés, même s'il existe plusieurs lignes avec le même salaire le plus bas.

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 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