Hoe vind je het derde of nᵗʰ maximum salaris uit de salaristabel?

Hoe vind je het derde of ndemaximum salaris van salaris table(EmpID, EmpName, EmpSalary)op een geoptimaliseerde manier?


Antwoord 1, autoriteit 100%

Rijnummer:

SELECT Salary,EmpName
FROM
  (
   SELECT Salary,EmpName,ROW_NUMBER() OVER(ORDER BY Salary) As RowNum
   FROM EMPLOYEE
   ) As A
WHERE A.RowNum IN (2,3)

Subquery :

SELECT *
FROM Employee Emp1
WHERE (N-1) = (
               SELECT COUNT(DISTINCT(Emp2.Salary))
               FROM Employee Emp2
               WHERE Emp2.Salary > Emp1.Salary
               )

Topzoekwoord :

SELECT TOP 1 salary
FROM (
      SELECT DISTINCT TOP n salary
      FROM employee
      ORDER BY salary DESC
      ) a
ORDER BY salary

Antwoord 2, autoriteit 96%

Gebruik ROW_NUMBER(als u een enkele wilt) of DENSE_RANK(voor alle gerelateerde rijen):

WITH CTE AS
(
    SELECT EmpID, EmpName, EmpSalary,
           RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
    FROM dbo.Salary
)
SELECT EmpID, EmpName, EmpSalary
FROM CTE
WHERE RN = @NthRow

Antwoord 3, autoriteit 72%

Probeer dit

SELECT TOP 1 salary FROM (
   SELECT TOP 3 salary 
   FROM employees 
   ORDER BY salary DESC) AS emp 
ORDER BY salary ASC

Voor 3 kun je elke waarde vervangen…


Antwoord 4, autoriteit 48%

Als u de manier wilt optimaliseren, gebruikt u het TOP-zoekwoord, dus de nth max en min salarissen als volgt, maar de query’s zien er lastig uit, zoals in omgekeerde volgorde door gebruik te maken van geaggregeerde functienamen:

N maximum salaris:

SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC) 

voor bijvoorbeeld: 3 maximum salaris:

SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC) 

N minimumloon:

SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary ASC)

voor bijvoorbeeld: 3 minimum salaris:

SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary ASC)

Antwoord 5, autoriteit 17%

Te simpel als je de subquery gebruikt!

SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);

Je kunt hier gewoon de n-de waarde na de LIMIT-beperking wijzigen.

Hier in deze subquery Selecteer Werknemerssalaris van Werknemersorder door Werknemerssalaris DESC Limiet 3; zou de top 3 salarissen van de werknemers teruggeven. Uit het resultaat zullen we het Minimumloon kiezen met behulp van het MIN-commando om het 3e TOP-salaris van de werknemer te krijgen.


Antwoord 6, autoriteit 16%

Vervang N door uw Max. aantal

SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)

Uitleg

De bovenstaande zoekopdracht kan behoorlijk verwarrend zijn als je nog nooit zoiets hebt gezien – de innerlijke zoekopdracht is een zogenaamde gecorreleerde subquery omdat de inner query (de subquery) een waarde uit de outer query gebruikt (in dit geval de Emp1-tabel) in zijn WHERE-clausule.

En Bron


Antwoord 7, autoriteit 14%

Derde of nde maximum salaris uit salaristabel zonder subquery te gebruiken

select salary from salary
   ORDER   BY salary DESC
   OFFSET  N-1 ROWS
   FETCH NEXT 1 ROWS ONLY

Voor 3e hoogste salaris zet 2 in plaats van N-1


Antwoord 8, autoriteit 12%

SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3

Antwoord 9, autoriteit 11%

SELECT EmpSalary 
FROM salary_table 
GROUP BY EmpSalary 
ORDER BY EmpSalary DESC LIMIT n-1, 1;

Antwoord 10, autoriteit 9%

Raadpleeg de volgende vraag om het op één na hoogste salaris te krijgen. Op deze manier krijg je het n-de hoogste salaris in MYSQL. Als u alleen het laagste salaris wilt krijgen, moet u DESC vervangen door ASC in de zoekopdracht.


Antwoord 11, autoriteit 6%

Methode 1:

SELECT TOP 1 salary FROM (
SELECT TOP 3 salary 
 FROM employees 
  ORDER BY salary DESC) AS emp 
 ORDER BY salary ASC

Methode 2:

 Select EmpName,salary from
  (
    select EmpName,salary ,Row_Number() over(order by salary desc) as rowid      
     from EmpTbl)
   as a where rowid=3

Antwoord 12, autoriteit 5%

In 2008 kunnen we ROW_NUMBER() OVER (ORDER BY EmpSalary DESC) gebruiken om een ​​rang te krijgen zonder banden die we kunnen gebruiken.

We kunnen op deze manier bijvoorbeeld de 8e hoogste krijgen, of @N veranderen in iets anders of het als een parameter in een functie gebruiken als je wilt.

DECLARE @N INT = 8;
WITH rankedSalaries AS
(
SELECT
EmpID
,EmpName
,EmpSalary,
,RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
FROM salary
)
SELECT
EmpID
,EmpName
,EmpSalary
FROM rankedSalaries
WHERE RN = @N;

In SQL Server 2012 wordt dit, zoals u wellicht weet, intuïtiever uitgevoerd met LAG().


Antwoord 13, autoriteit 4%

declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR   ORDER BY GRN_NAME DESC
print @maxNthSal

Antwoord 14, autoriteit 4%

Om de op twee na hoogste waarde uit de tabel te halen

SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1

Antwoord 15, autoriteit 3%

Dit is een van de populaire vragen in elk SQL-interview. Ik ga verschillende zoekopdrachten opschrijven om de op één na hoogste waarde van een kolom te achterhalen.

Ik heb een tabel gemaakt met de naam “Emloyee” door het onderstaande script uit te voeren.

CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)

Nu ga ik 8 rijen in deze tabel invoegen door het onderstaande insert statement uit te voeren.

insert into Employee values(1,'Neeraj',45000)
insert into Employee values(2,'Ankit',5000)
insert into Employee values(3,'Akshay',6000)
insert into Employee values(4,'Ramesh',7600)
insert into Employee values(5,'Vikas',4000)
insert into Employee values(7,'Neha',8500)
insert into Employee values(8,'Shivika',4500)
insert into Employee values(9,'Tarun',9500)

Nu zullen we de 3e hoogste Basic_sal uit de bovenstaande tabel vinden met behulp van verschillende zoekopdrachten.
Ik heb de onderstaande query uitgevoerd in managementstudio en hieronder is het resultaat.

select * from Employee order by Basic_Sal desc

We kunnen in de bovenstaande afbeelding zien dat het 3e hoogste basissalaris 8500 zou zijn. Ik schrijf drie verschillende manieren om hetzelfde te doen. Door alle drie de onderstaande zoekopdrachten uit te voeren, krijgen we hetzelfde resultaat, namelijk 8500.

Eerste manier: – Rijnummerfunctie gebruiken

select Ename,Basic_sal
from(
            select Ename,Basic_Sal,ROW_NUMBER() over (order by Basic_Sal desc) as rowid from Employee
      )A
where rowid=2

Antwoord 16, autoriteit 3%

Select TOP 1 Salary as '3rd Highest Salary' from (SELECT DISTINCT TOP 3 Salary from Employee ORDER BY Salary DESC) a ORDER BY Salary ASC;

Ik laat het op twee na hoogste salaris zien


Antwoord 17, autoriteit 3%

SELECT MIN(COLUMN_NAME)
FROM   (
           SELECT DISTINCT TOP 3     COLUMN_NAME
           FROM   TABLE_NAME
           ORDER BY
                  COLUMN_NAME        DESC
       ) AS 'COLUMN_NAME'

Antwoord 18, autoriteit 3%

–nde hoogste salaris

select * 
from (select lstName, salary, row_number() over( order by salary desc) as rn 
      from employee) tmp
where rn = 2

–(nth -1) hoogste salaris

select * 
from employee e1
where 1 = (select count(distinct salary)  
           from employee e2
           where e2.Salary > e1.Salary )

Antwoord 19, autoriteit 3%

Geoptimaliseerde manier: gebruik in plaats van subquery gewoon limiet.

select distinct salary from employee order by salary desc limit nth, 1;

Bekijk hier de limietsyntaxis http://www.mysqltutorial.org/mysql-limit.aspx


Antwoord 20, autoriteit 3%

Deze vraag beantwoorden vanuit het oogpunt van SQL Server, zoals deze is gepost in de sectie SQL Server.

Er zijn veel manieren om het N-de salaris te krijgen en we kunnen deze benaderingen in twee secties indelen, één met behulp van de ANSI SQL-benadering en de andere met behulp van de TSQL-benadering. Je kunt ook deze de youtube-video met het hoogste salarisbekijken die de zaken praktisch laat zien. Laten we proberen drie manieren te bespreken om deze SQL te schrijven.

  • Aanpak nummer 1: – ANSI SQL: – Eenvoudige volgorde op en topzoekwoord gebruiken.
  • Aanpak nummer 2: – ANSI SQL: – Co-gerelateerde subquery’s gebruiken.
  • Benadering nummer 3: – TSQL: – met Fetch Next

Aanpak nummer 1: – Gebruik eenvoudige volgorde door en bovenaan.

In deze benadering gebruiken we een combinatie van zoekwoord op volgorde en top. We kunnen ons denkproces in 4 stappen verdelen: –

Stap 1: – Aflopend: – Welke gegevens we ook hebben, maak ze eerst aflopend door volgorde per clausule te gebruiken.

Stap 2:- Gebruik vervolgens het TOP-zoekwoord en selecteer TOP N. Waarbij N staat voor welke hoogste salarisrang je wilt.

Stap 3: – Oplopend: – Maak de gegevens oplopend.

Stap 4:- Selecteer top 1. Daar ben je klaar.

Dus als je de bovenstaande 4 logische stappen in SQL invoert, krijg je iets zoals hieronder weergegeven.

Hieronder staat de tekst van SQL voor het geval u hetzelfde wilt uitvoeren en testen.

selecteer top 1 * van (selecteer top 2 werknemerssalaris van tblEmployee
order by EmployeeSalary desc) als innerquery order by EmployeeSalary
asc

Parametreringsprobleem van aanpak Nummer 1

Een van de grootste kwesties van aanpak nummer 1 is “Parametrering”.

Als u de bovenstaande SQL naar een opgeslagen procedure wilt inpakken en invoer wilt geven welk topsalaris u als een parameter wilt, zou het moeilijk zijn door Nummer 1.

Een van de dingen die u kunt doen met aanpak nummer 1 is het een dynamische SQL maken, maar dat zou geen elegante oplossing zijn. Laten we de aanpak van nummer 2 bekijken, wat een ANSI SQL-aanpak is.

Nummer 2: – Gebruik van mede-gerelateerde subqueries.

Hieronder ziet het met mede-gerelateerde subquery-oplossing eruit. In het geval dat u nieuw bent bij mede-gerelateerde subquery. Co-gerelateerde subquery is een query die een query inside query is. De buitenste query evalueert eerst, verzendt het record naar de innerlijke query, innerlijke query en evalueert en verzendt het naar de buitenste query.

“3” in de query is het topsalaris dat we willen weten.

Selecteer E1.employeesalary van TBLemployee als E1 waar 3 = (selecteer
tel (*) van tblemployee als E2 waar
E2.employeesAalary & GT; = E1.employeesalary)

Dus in de bovenstaande query hebben we een buitenste query: –

Selecteer E1.employeesalary van TBLemployee als E1

en innerlijke query bevindt zich in de buurt. Bekijk die bold’s die aangeven hoe de buitenste tabel alias wordt verwezen in de waar clausule die mede-gerelateerde evaluatie innerlijke en buitenste vraag en weer maakt: –

waar 3 = (selecteer telling (*) van tblemployee als E2 waar
E2.employeesAlary & GT; = E1.employeesalary)

Dus laten we nu zeggen dat je records hebt zoals 3000, 4000, 1000 en 100, dus hieronder is de stappen: –

  1. eerste 3000 wordt naar de innerlijke query verzonden.
  2. Inner Query controleert nu hoeveel recordwaarden groter zijn dan of gelijk aan 3000. Als het aantal recordcellen niet gelijk is, zal het de volgende waarde duren die 4000 is. Nu voor 3000 zijn er slechts 2 waarden die groter zijn dan of gelijk, 3000 en 4000. Dus is het aantal nummer 2 & GT; – = 3? . Geen, dus het kost de tweede waarde die 4000 is.
  3. opnieuw voor 4000 hoeveel recordwaarden groter zijn dan of gelijk. Als het aantal recordcellen niet gelijk is, duurt het de volgende waarde die 1000 is.
  4. Nu 1000 heeft 3 records meer of gelijk dan 1000, (3000.4000 en 1000 zelf). Dit is waar mede-gerelateerde stops en uitgangen en de laatste uitvoer geeft.

Nummer 3: – TSQL halen en volgende.

Derde aanpak is door TSQL te gebruiken. Door fetch en volgende te gebruiken, kunnen we de NTH hoogst gemakkelijk krijgen.

Maar gelieve opmerking, TSQL-code werkt niet voor andere databases die we nodig hebben om de hele code opnieuw te herschrijven.

Het zou een proces van drie stappen zijn: –

Stap 1 Deselecteerd en bestellen door af te dalen : – Vraag eerst onderscheidend en bestel door waardoor de salarissen die aflopend zijn, evenals wielen van de duplicaten.

Stap 2 Gebruik offset : – Gebruik TSQL-offset en ontvang de top N-1 rijen. Waar n het hoogste salaris is dat we willen krijgen. Offset neemt het aantal rijen opgegeven, waardoor de andere rijen achterblijven. Waarom (n-1) omdat het begint met nul.

Stap 3 Gebruik fetch : – Gebruik ophalen en ontvang de eerste rij. Die rij heeft het hoogste salaris.

De SQL ziet er iets uit zoals hieronder wordt getoond.

Performance vergelijking

Hieronder staat het SQL-plan voor de prestatiesvergelijking.
Hieronder staat het plan voor boven en bestel.

Hieronder staat het plan voor co-gerelateerde vragen. U kunt zien dat het aantal operators vrij hoog is. Dus co-gerelateerd zou zeker slecht presteren voor enorme gegevens.

Hieronder staat het TSQL-queryplan dat beter is dan cor-gerelateerd.

Dus samenvattend kunnen we meer holistisch vergelijken, zoals weergegeven in de onderstaande tabel.


Antwoord 21, autoriteit 2%

Op subquery:

SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)

Antwoord 22

Probeer deze zoekopdracht

SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary) 
FROM emp WHERE E.salary <= salary)

Zet n= welke waarde je wilt


Antwoord 23

set @n = $n
SELECT a.* FROM ( select a.* , @rn = @rn+1  from EMPLOYEE order by a.EmpSalary desc ) As a  where rn = @n

Antwoord 24

MySQL-geteste oplossing, neem aan dat N = 4:

select min(CustomerID) from (SELECT distinct CustomerID FROM Customers order by CustomerID desc LIMIT 4) as A;

Nog een voorbeeld:

select min(country) from (SELECT distinct country FROM Customers order by country desc limit 3);

Antwoord 25

Probeer deze code:-

SELECT *
   FROM one one1
   WHERE ( n ) = ( SELECT COUNT( one2.salary )
                   FROM one one2
                   WHERE one2.salary >= one1.salary
                 )

Antwoord 26

Vind het N-de hoogste salaris in een tabel. Hier is een manier om deze taak uit te voeren met behulp van de functie density_rank().

select linkorder from u_links
select max(linkorder) from u_links
select max(linkorder) from u_links where linkorder < (select max(linkorder) from u_links)
select top 1 linkorder 
       from ( select distinct top 2 linkorder from u_links order by linkorder desc) tmp 
order by linkorder asc

DENSE_RANK :
1. DENSE_RANK berekent de rangorde van een rij in een geordende groep rijen en retourneert de rangorde als een NUMBER. De rangen zijn opeenvolgende gehele getallen die beginnen met 1.
2. Deze functie accepteert argumenten als elk numeriek gegevenstype en retourneert NUMBER.
3. Als analytische functie berekent DENSE_RANK de rangorde van elke rij die wordt geretourneerd door een query met betrekking tot de andere rijen, op basis van de waarden van de value_exprs in de order_by_clause.
4. In de bovenstaande query wordt de rang teruggegeven op basis van het salaris van de werknemerstabel. In het geval van gelijkspel, kent het een gelijke rang toe aan alle rijen.

WITH result AS ( 
     SELECT linkorder ,DENSE_RANK() OVER ( ORDER BY linkorder DESC ) AS  DanseRank 
FROM u_links ) 
SELECT TOP 1 linkorder FROM result WHERE DanseRank = 5

Antwoord 27

In SQL Server 2012+ zou OFFSET…FETCH een efficiënte manier zijn om dit te bereiken:

DECLARE @N AS INT;
SET @N = 3;
SELECT
    EmpSalary
FROM
    dbo.Salary
ORDER BY
    EmpSalary DESC
OFFSET (@N-1) ROWS
FETCH NEXT 1 ROWS ONLY

Antwoord 28

select * from employee order by salary desc;
+------+------+------+-----------+
| id   | name | age  | salary    |
+------+------+------+-----------+
|    5 | AJ   |   20 | 100000.00 |
|    4 | Ajay |   25 |  80000.00 |
|    2 | ASM  |   28 |  50000.00 |
|    3 | AM   |   22 |  50000.00 |
|    1 | AJ   |   24 |  30000.00 |
|    6 | Riu  |   20 |  20000.00 |
+------+------+------+-----------+
select distinct salary from employee e1 where (n) = (select count( distinct(salary) ) from employee e2 where e1.salary<=e2.salary);

Vervang n door het n-de hoogste salaris als getal.


Antwoord 29

SELECT TOP 1 salary FROM ( SELECT TOP n salary FROM employees ORDER BY salary DESC Group By salary ) AS emp ORDER BY salary ASC

(waarbij n staat voor het nde maximum salaris)


Antwoord 30

Verander gewoon de waarde van de innerlijke query: bijv. Selecteer Top (2)* van Student_Info, bestel op ClassID desc

Gebruik voor beide problemen:

Select Top (1)* from 
(
 Select Top (1)* from Student_Info order by ClassID desc 
) as wsdwe
order by ClassID 

Other episodes