Dit is eenvoudig op te lossen met analytische functies. Zoals u kunt zien, verdienen er twee werknemers het maximale salaris in DEPT 20; dit is een belangrijk detail, omdat sommige veelvoorkomende oplossingen voor dit soort problemen die informatie missen.
SQL> select ename
2 , deptno
3 , sal
4 from (
5 select ename
6 , deptno
7 , sal
8 , max (sal) over (partition by deptno) max_sal
9 , min (sal) over (partition by deptno) min_sal
10 from emp
11 )
12 where sal = max_sal
13 or sal = min_sal
14 order by deptno, sal
15 /
ENAME DEPTNO SAL
---------- ---------- ----------
KISHORE 10 1300
SCHNEIDER 10 5000
CLARKE 20 800
RIGBY 20 3000
GASPAROTTO 20 3000
HALL 30 950
LIRA 30 3750
TRICHLER 50 3500
FEUERSTEIN 50 4500
9 rows selected.
SQL>
Oeps, ik heb een belangrijk detail over het resultaatformaat gemist. Mijn gegevens passen niet bij de gevraagde output, omdat er twee medewerkers zijn die het maximale salaris verdienen. Dus deze vraag, waarvan ik moet toegeven dat het een beetje onhandig is, geeft ons de vereiste lay-out. De MIN() op de namen van de werknemers geeft de alfabetische volgorde terug:
SQL> select
2 deptno
3 , max (case when sal = min_sal then min_sal else null end ) as min_sal
4 , min (case when sal = min_sal then ename else null end ) as min_name
5 , max (case when sal = max_sal then max_sal else null end ) as max_sal
6 , min (case when sal = max_sal then ename else null end ) as max_name
7 from (
8 select ename
9 , deptno
10 , sal
11 , max (sal) over (partition by deptno) max_sal
12 , min (sal) over (partition by deptno) min_sal
13 from emp
14 )
15 where sal = max_sal
16 or sal = min_sal
17 group by deptno
18 order by deptno
19 /
DEPTNO MIN_SAL MIN_NAME MAX_SAL MAX_NAME
---------- ---------- ---------- ---------- ----------
10 1300 KISHORE 5000 SCHNEIDER
20 800 CLARKE 3000 GASPAROTTO
30 950 HALL 3750 LIRA
50 3500 TRICHLER 4500 FEUERSTEIN
SQL>
Ik hou niet van deze oplossing. De meeste datasets zullen dergelijke botsingen bevatten, en we moeten ze erkennen. Het is misleidend om het resultaat te filteren op basis van enkele niet-gerelateerde criteria om in een Procrustean-rapportlay-out te passen. Ik zou de voorkeur geven aan een rapportlay-out die de hele dataset weergeeft. Uiteindelijk hangt het af van het zakelijke doel dat de zoekopdracht dient. En natuurlijk heeft de klant altijd gelijk 8-)