Dette er let løseligt med analytiske funktioner. Som du kan se, er der to medarbejdere, der tjener den maksimale løn i DEPT 20; dette er en vigtig detalje, da nogle almindelige løsninger på denne type problemer savner den information.
SQL> vælg ename 2 , deptnr. 3 , sal 4 fra ( 5 vælg ename 6 , deptnr. 7 , sal 8 , max (sal) over (partition efter deptnr) max_sal 9 , min (sal) over (partition af deptno) min_sal 10 fra emp 11 ) 12 hvor sal =max_sal 13 eller sal =min_sal 14 bestilles af deptnr, sal 15 /ENAME DEPTNO SAL------------- ----------KISHORE 10 1300SCHNEIDER 10 5000CLARKE 20 800RIGBY 20 3000GASPAROTTO 20 3000HALL 30 950LIRA 30 3750TRICHLER 50 3500FEUERSTEIN 5009 valgt.
Ups, jeg gik glip af en vigtig detalje om resultatformatet. Mine data passer ikke til det ønskede output, fordi der er to medarbejdere, der tjener den maksimale løn. Så denne forespørgsel, som jeg indrømmer er en smule akavet, giver os det nødvendige layout. MIN() på medarbejdernavnene returnerer den alfabetiske rækkefølge:
SQL> vælg 2 deptno 3 , max (tilfælde når sal =min_sal derefter min_sal else null end ) som min_sal 4 , min (case når sal =min_sal derefter ename else null end ) som min_name 5 , max (case når sal =max_sal så max_sal else null end ) som max_sal 6 , min (tilfælde når sal =max_sal så ename else null end ) som max_name 7 fra ( 8 vælg ename 9 , deptno 10 , sal 11 , max (sal) over (partition af deptnr) max_sal 12 , min (sal) over (opdeling efter deptnr) min_sal 13 fra emp 14 ) 15 hvor sal =max_sal 16 eller sal =min_sal 17 grupper efter deptnr 18 sorteres efter deptnr 19 / DEPTNO MIN_SAL MIN_MAX_NAME MAX_SAL ------- ---------- ---------- ---------- ---------- 10 1300 KISHORE 5000 SCHNEIDER 20 800 CLARKE 3000 GASPAROTTO 30 950 HALL 3750 LIRA 50 3500 TRICHLER 4500 FEUERST EINSQL>
Jeg kan ikke lide denne løsning. De fleste datasæt vil indeholde sådanne sammenstød, og vi er nødt til at anerkende dem. At filtrere resultatet på basis af nogle ikke-relaterede kriterier for at passe til et Procrustean-rapportlayout er vildledende. Jeg ville foretrække et rapportlayout, der afspejlede hele datasættet. I sidste ende afhænger det af det forretningsformål, som forespørgslen tjener. Og selvfølgelig har kunden altid ret 8-)