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 afdeptno
; derefterORDER BY sal
betyder, for hver partition, at rækkerne bestilles eftersal
(implicit ved hjælp afASC
afsluttende rækkefølge); derefterKEEP (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 sidstMIN(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 |