sql >> Database >  >> RDS >> Oracle

Waarden verkrijgen met betrekking tot de max- en min-rijen in Oracle

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-)



  1. postgres:een gebruiker upgraden naar een superuser?

  2. Fout:ER_WRONG_VALUE_COUNT_ON_ROW:kolomtelling komt niet overeen met waardetelling in rij 1

  3. Hoe een absolute waarde in SQL te berekenen?

  4. hoe kan dit de prestaties beïnvloeden wanneer ik UUID's als mijn primaire sleutels in MySQL gebruik?