sql >> Database >  >> RDS >> Oracle

PARTITIE DOOR met en zonder KEEP in Oracle

MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno)

De verklaring kan worden beschouwd in (ruwweg) van rechts naar links volgorde:

  • OVER (PARTITION BY deptno) betekent de rijen opdelen in verschillende groepen van deptno; dan
  • ORDER BY sal betekent, voor elke partitie, de rijen ordenen op sal (impliciet met behulp van ASC eindopdracht); dan
  • KEEP (DENSE_RANK FIRST middelen geven een (opeenvolgende) rangorde aan de geordende rijen voor elke partitie (rijen met identieke waarden voor de ordeningskolommen krijgen dezelfde rangorde) en verwerpen alle rijen die niet als eerste gerangschikt zijn; en tot slot
  • MIN(sal) voor de resterende rijen van elke partitie, retourneer het minimumloon.

In dit geval de MIN en DENSE_RANK FIRST werken beide op de sal kolom dus zal hetzelfde doen en de KEEP (DENSE_RANK FIRST ORDER BY sal) is overbodig.

Als u echter een andere kolom voor het minimum gebruikt, kunt u de effecten zien:

SQL Fiddle

Oracle 11g R2 Schema-instellingen :

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;

Query 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

Resultaten :

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


  1. Rails, PostgreSQL en geschiedenistriggers

  2. SQLite INTERSECT-operator

  3. Gegevensopslag:REST versus POSIX voor archieven en HSM

  4. Verschil tussen schema / database in MySQL