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 salsignifie, pour chaque partition, ordonner les lignes parsal(en utilisant implicitementASCfin de commande) ; alorsKEEP (DENSE_RANK FIRSTdes 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 |