sql >> Databasteknik >  >> RDS >> Oracle

Hämta värden relaterade till max- och min-raderna i Oracle

Detta är lätt att lösa med analytiska funktioner. Som du kan se är det två anställda som tjänar maxlönen på DEPT 20; detta är en viktig detalj, eftersom några vanliga lösningar på den här typen av problem missar den informationen.

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>

Oj, jag missade en viktig detalj om resultatformatet. Mina uppgifter kommer inte att passa den begärda produktionen, eftersom det finns två anställda som tjänar maxlönen. Så den här frågan, som jag erkänner är lite besvärlig, ger oss den nödvändiga layouten. MIN() på anställdas namn returnerar den alfabetiska ordningen :

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>

Jag gillar inte den här lösningen. De flesta datamängder kommer att innehålla sådana sammandrabbningar, och vi måste erkänna dem. Att filtrera resultatet på grundval av några icke-relaterade kriterier för att passa en Procrustean-rapportlayout är missvisande. Jag skulle föredra en rapportlayout som speglar hela datasetet. I slutändan beror det på vilket affärssyfte som frågan tjänar. Och naturligtvis har kunden alltid rätt 8-)



  1. RuntimeError:OperationalError:(2003, Kan inte ansluta till MySQL-servern på 'instansens IP-adress'

  2. SQL Server och MySQL-synkronisering

  3. Databas:Bästa sättet att fråga efter geografisk platsdata?

  4. Få positionen för en karaktär i en sträng i SQLite med Instr()