Oracle
 sql >> Base de données >  >> RDS >> Oracle

PARTITION BY avec et sans KEEP dans Oracle

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 de deptno; alors
  • ORDER BY sal signifie, pour chaque partition, ordonner les lignes par sal (en utilisant implicitement ASC fin de commande) ; alors
  • KEEP (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 enfin
  • MIN(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 |