MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno)
Påståendet kan betraktas i (ungefär) höger-till-vänster-ordning:
OVER (PARTITION BY deptno)
betyder att dela upp raderna i distinkta grupper avdeptno
; sedanORDER BY sal
betyder, för varje partition, ordna raderna eftersal
(underförstått använderASC
slutordning); sedanKEEP (DENSE_RANK FIRST
innebär att ge en (konsekutiv) rankning till de ordnade raderna för varje partition (rader med identiska värden för ordningskolumnerna kommer att ges samma rang) och kassera alla rader som inte rankas först; och slutligenMIN(sal)
för de återstående raderna i varje partition, returnera minimilönen.
I det här fallet MIN
och DENSE_RANK FIRST
fungerar båda på sal
kolumnen så kommer att göra samma sak och KEEP (DENSE_RANK FIRST ORDER BY sal)
är överflödig.
Men om du använder en annan kolumn för minimum kan du se effekterna:
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;
Fråga 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
Resultat :
| 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 |