9
votes

Comment chercher le nième salaire le plus élevé d'une table sans utiliser haut et sous-requête?

Récemment dans une interview à qui j'ai été invité à écrire une requête où je devais chercher nième salaire le plus élevé d'une table sans utiliser de haut et de toute sous-requête?

Je suis totalement confus car la seule façon dont je savais la mise en œuvre utilise à la fois le haut et la sous-requête.

fournir gentiment sa solution.

Merci d'avance.


4 commentaires

S'il y a trois salaires: 10, 20 et 20, qui est le deuxième plus haut? Est-ce 20 parce que les deux premiers sont tous deux 20? Ou est-ce 10 parce que 20 est le plus élevé et 10 est le prochain le plus élevé? En d'autres termes, voulez-vous récupérer le NTH le plus élevé salaire distinct ou le plus grand salaire?


Intéressant que l'intervieweur a déclaré "sous-requête". J'aurais dit qu'il s'agissait d'une "table dérivée" pour la solution supérieure Desc / Top ASC


@Mark La sortie souhaitée est distincte de la nième salaire le plus élevé.


Ensuite, jetez un coup d'œil à dense_rank ( msdn.microsoft.com/en-us/library /ms173825.aspx ).


17 Réponses :


11
votes

Essayez un CTE - Expression de table commune:

WITH Salaries AS
(
    SELECT 
       SalaryAmount, NTILE(10) OVER(ORDER BY SalaryAmount DESC) AS 'NTile'
    FROM 
       dbo.SalaryTable
)
SELECT
  SalaryAmount
FROM
  Salaries
WHERE
   NTile = 1


3 commentaires

Monsieur .... Dans la première solution, pourquoi nous n'utilisons pas la partition par clause dans la fonction CTE .. ??


@AkhileShsingh: Parce qu'il n'ya pas d'exigence de montrer le "top n pour chacun (quelque chose)". L'OP veut juste que le N-ème salaire le plus élevé sur Tous les traitements - Not N-Th Hightest dans un groupe particulier (N-Te le plus élevé pour chaque pays, pour chaque profession ou quelque chose comme ça).


Je l'ai eu ... merci uu :)



11
votes
;with cte as(
Select salary,
row_number() over (order by salary desc) as rn
from salaries
)

select salary 
from cte 
where rn=@n
(or use dense_rank in place of row_number if you want the nth highest distinct salary amount)

0 commentaires

5
votes
Select  * 
From    Employee E1 
Where
N = (Select Count(Distinct(E2.Salary)) From Employee E2 Where E2.Salary >= E1.Salary)

3 commentaires

+1 Parce que cela fonctionne, mais les fonctions de classement sont beaucoup plus efficaces. Il utilise également clairement une sous-requête mais je ne sais pas si la question signifiait sans utiliser top ou une sous-requête.


À cause de distinct ceci est plutôt un équivalent de dense_rank () que row_number () . (Et la question n'est pas absolument claire laquelle l'on est plus appropriée, cela pourrait bien ça va aussi.)


@Venktsesh Je cherchais cela, veuillez expliquer comment fonctionne la sous-requête de la clause.



3
votes
with cte as(
select VendorId,IncomeDay,IncomeAmount,
Row_Number() over ( order by IncomeAmount desc) as RowNumber
 from DailyIncome 
 )

 select * from cte
 where RowNumber=2

0 commentaires

1
votes

Essayez ceci. XXX


0 commentaires

1
votes

Il peut simplement être fait comme suit pour le second plus haut -

Select MAX(Salary) from employer where Salary NOT IN(Select MAX(Salary) from employer);


0 commentaires

1
votes

S'il y a des entrées en double de

30 000,
23 000,
23 000,
15 000,
14 800 p>

La requête sélectionnée ne renvoie pas la sortie correcte. P>

Recherche de la requête correcte comme ci-dessous: P>

with salaries as
(
    select Salary,DENSE_RANK() over (order by salary desc) as 'Dense' 
    from Table_1
)
select distinct salary from salaries
where dense=3


0 commentaires

-1
votes

Le plus élevé Sal utilise MS SQL Server:

Sélectionnez Sal de EMP où SAL = (Sélectionnez Max (SAL) de EMP)

deuxième plus haut s sal:

Sélectionnez Max (SAL) de EMP où SAL PAS IN (SELECT (SAL) de EMP)


1 commentaires

La question dit sans utiliser de sous-requête



1
votes

Essayez ceci. Il peut très facile de trouver des éléments de nième rang en utilisant CTE ** xxx

** **


0 commentaires

-2
votes

Et si nous sommes tenus de trouver le NTH le plus élevé salaire sans Row_Number, classement, rang et sous-requête dense?

J'espère que cette requête ci-dessous aide à sortir. p>

Sélectionnez * à partir de [DGO]. [Test ] Commander par Salaire Desc P>

Emp_Id  Name    Salary  Department
 4      Neelu   10000   NULL
 2      Rohit   4000    HR
 3      Amit    3000    OPS
 1      Rahul   2000    IT



select B.Salary from TEst B join Test A
on B.Salary<=A.Salary 
group by (B.Salary)
having count(B.salary)=2


0 commentaires

2
votes

Affiche la table EMP 5ème Min Sal SA.

SELECT * FROM (SELECT Dense_Rank () Over (ORDER BY Sal ASC) AS Rnk, Emp.* FROM Emp) WHERE
Rnk=5;


0 commentaires

1
votes

Pour trouver le nième salaire le plus élevé:
Nom de la table - EMP

select salary from (select salary from Emp order by salary DESC LIMIT N) AS E order by ASC LIMIT 1;


0 commentaires

0
votes
 SELECT salery,name
 FROM employ
 ORDER BY salery DESC limit 1, OFFSET n

0 commentaires

0
votes
with CTE_name (salary,name)
AS
( row_num() over (order by desc salary) as num from tablename )
select salary, name from CTE_name where num =1;
This will work in oracle

0 commentaires

0
votes

Pour trouver le nième salaire le plus élevé, nous envisagons uniquement des salaires uniques.Le salaire le plus sûr, aucun salaire n'est supérieur à celui-ci, deuxièmes moyens les plus élevés, un seul salaire est supérieur à celui-ci, 3ème moyen le plus élevé, deux salaires sont plus élevés qu'auparavant, De même, le nième salaire le plus élevé signifie que les salaires N-1 sont plus élevés que cela. Eh bien, vous pouvez faire en utilisant LIMITE LIMITE STRAND>, qui fournit une pagination Capabilisation.Vous pouvez faire comme ci-dessous: XXX PRE>

EX: 2ème salaire le plus élevé dans MySQL sans sous-requête: P>

SELECT salary FROM Employee ORDER BY salary DESC LIMIT 1,1


1 commentaires

Ce n'est pas valide dans SQL Server.



0
votes

6- façons d'écrire un deuxième salaire le plus élevé. **

1.Sélectionnez * de l'ordre de l'employé par salaire descendez 1 rangs Fetch Suivant 1 rangée uniquement

2.Sélectionnez Max (salaire) de l'employé où salaire <(Sélectionnez Max (salaire) de l'employé)

3.Sélectionnez Max (salaire) de l'employé où salaire n'est pas dans (Sélectionnez Max (salaire) de l'employé);

4.Sélectionnez Max (E1.Salary) de l'employé E1, employé E2 où E1.Salary

5.voie CTE comme ( Sélectionnez *, Row_Number () sur (Commande par Salaire Desc) comme Rownum de l'employé en tant que RN) Sélectionnez * de CTE où Rownum = 2

6.Sélectionnez Max (E1.Salary) de l'employé E1, employé E2 où E1.Salaire


0 commentaires

0
votes

Correction correcte d'obtenir le nième salaire le plus élevé à l'aide de la fonction Ntile.

SELECT DISTINCT SAL INTO #TEMP_A FROM EMPLOYEE 

DECLARE @CNT INT

SELECT @CNT=COUNT(1) FROM #TEMP_A

;WITH RES
AS(
SELECT SAL,NTILE(@CNT) OVER (ORDER BY SAL DESC) NTL
FROM #TEMP_A )

SELECT SALFROM RES WHERE NTL=3

DROP TABLE #TEMP_A


0 commentaires