MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno)
L'énoncé peut être considéré dans l'ordre (approximativement) de droite à gauche :
OVER (PARTITION BY deptno)
signifie partitionner les lignes en groupes distincts dedeptno
; alorsORDER BY sal
signifie, pour chaque partition, ordonner les lignes parsal
(en utilisant implicitementASC
fin de commande) ; alorsKEEP (DENSE_RANK FIRST
des moyens donnent un classement (consécutif) aux rangées ordonnées pour chaque partition (les rangées avec des valeurs identiques pour les colonnes de classement recevront le même rang) et rejettent toutes les rangées qui ne sont pas classées premières ; et enfinMIN(sal)
pour les lignes restantes de chaque partition, renvoie le salaire minimum.
Dans ce cas le MIN
et DENSE_RANK FIRST
fonctionnent tous les deux sur le sal
la colonne fera donc la même chose et le KEEP (DENSE_RANK FIRST ORDER BY sal)
est redondant.
Cependant, si vous utilisez une colonne différente pour le minimum, vous pouvez voir les effets :
Violon SQL
Configuration du schéma Oracle 11g R2 :
CREATE TABLE test (name, sal, deptno) AS
SELECT 'a', 1, 1 FROM DUAL
UNION ALL SELECT 'b', 1, 1 FROM DUAL
UNION ALL SELECT 'c', 1, 1 FROM DUAL
UNION ALL SELECT 'd', 2, 1 FROM DUAL
UNION ALL SELECT 'e', 3, 1 FROM DUAL
UNION ALL SELECT 'f', 3, 1 FROM DUAL
UNION ALL SELECT 'g', 4, 2 FROM DUAL
UNION ALL SELECT 'h', 4, 2 FROM DUAL
UNION ALL SELECT 'i', 5, 2 FROM DUAL
UNION ALL SELECT 'j', 5, 2 FROM DUAL;
Requête 1 :
SELECT DISTINCT
MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS min_sal_first_sal,
MAX(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS max_sal_first_sal,
MIN(name) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS min_name_first_sal,
MAX(name) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS max_name_first_sal,
MIN(name) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) AS min_name_last_sal,
MAX(name) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) AS max_name_last_sal,
deptno
FROM test
Résultats :
| MIN_SAL_FIRST_SAL | MAX_SAL_FIRST_SAL | MIN_NAME_FIRST_SAL | MAX_NAME_FIRST_SAL | MIN_NAME_LAST_SAL | MAX_NAME_LAST_SAL | DEPTNO |
|-------------------|-------------------|--------------------|--------------------|-------------------|-------------------|--------|
| 1 | 1 | a | c | e | f | 1 |
| 4 | 4 | g | h | i | j | 2 |