sql >> Database teknologi >  >> RDS >> Oracle

Hvordan finder man den medarbejder med den næsthøjeste løn?

Måden at gøre dette på er med Oracles analytiske funktioner. Dit særlige scenarie er blot en variant af den løsning, jeg gav i en anden tråd.

Hvis du er interesseret i blot at vælge den næsthøjeste løn, så vil enhver af DENSE_RANK(), RANK() og ROW_NUMBER() gøre tricket:

SQL> select * from
  2   ( select sal
  3            , rank() over (order by sal desc) as rnk
  4     from
  5      ( select distinct sal
  6        from emp )
  7    )
  8  where rnk = 2
  9  /

       SAL        RNK
---------- ----------
      3000          2

SQL> 

Men hvis du ønsker at vælge yderligere oplysninger, såsom navnet på den medarbejder med næsthøjeste løn, vil den funktion du vælger, påvirke resultatet. Hovedårsagen til at vælge en frem for en anden er, hvad der sker, når der er uafgjort.

Hvis du bruger ROW_NUMBER(), vil den returnere den anden medarbejder sorteret efter løn:hvad hvis der er to medarbejdere, der binder den højeste løn? Hvad hvis der er to medarbejdere, der binder den næsthøjeste løn? Mens hvis du bruger RANK() og der er to medarbejdere, der binder til den første højeste løn, vil der være ingen poster med RANK =2.

Jeg foreslår, at DENSE_RANK() er den normalt sikreste funktion at vælge i disse tilfælde, men det afhænger virkelig af det specifikke forretningskrav.



  1. Sådan fungerer LN() i MariaDB

  2. Hvordan eksporterer man en mysql-database ved hjælp af kommandoprompt?

  3. effektiv måde at implementere personsøgning på

  4. Hvordan vælger jeg effektivt den tidligere ikke-nul værdi?