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