sql >> Database teknologi >  >> RDS >> Oracle

PARTITION BY med og uden KEEP i Oracle

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

Udsagnet kan betragtes i (omtrent) højre-mod-venstre rækkefølge:

  • OVER (PARTITION BY deptno) betyder opdeling af rækkerne i distinkte grupper af deptno; derefter
  • ORDER BY sal betyder, for hver partition, at rækkerne bestilles efter sal (implicit ved hjælp af ASC afsluttende rækkefølge); derefter
  • KEEP (DENSE_RANK FIRST betyder at give en (konsekutiv) rangering til de ordnede rækker for hver partition (rækker med identiske værdier for rækkefølgekolonnerne vil få samme rang) og kassere alle rækker, der ikke er rangeret først; og til sidst
  • MIN(sal) returner minimumslønnen for de resterende rækker af hver partition.

I dette tilfælde MIN og DENSE_RANK FIRST opererer begge på sal kolonnen så vil gøre det samme, og KEEP (DENSE_RANK FIRST ORDER BY sal) er overflødig.

Men hvis du bruger en anden kolonne til minimum, kan du se effekterne:

SQL Fiddle

Oracle 11g R2 Schema Setup :

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;
 

Forespørgsel 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
 

Resultater :

| 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. Kan nogen forklare, hvad MERGE-erklæringen virkelig gør i Oracle?

  2. MySQL FLOOR() Funktion – Rund ned til nærmeste heltal

  3. Sådan beregnes procent i PostgreSQL

  4. Sådan bruges GROUP BY-klausul i SQL