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? P>
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. P>
fournir gentiment sa solution. P>
Merci d'avance. P>
17 Réponses :
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
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 B> - 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 :)
;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)
Select * From Employee E1 Where N = (Select Count(Distinct(E2.Salary)) From Employee E2 Where E2.Salary >= E1.Salary)
+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 code> ou b> une sous-requête.
À cause de distinct code> ceci est plutôt un équivalent de
dense_rank () code> que
row_number () code>. (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.
with cte as( select VendorId,IncomeDay,IncomeAmount, Row_Number() over ( order by IncomeAmount desc) as RowNumber from DailyIncome ) select * from cte where RowNumber=2
Essayez ceci.
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);
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
Le plus élevé Sal utilise MS SQL Server: P>
deuxième plus haut s sal: p>
Sélectionnez Sal de EMP où SAL = (Sélectionnez Max (SAL) de EMP) CODE> P>
Sélectionnez Max (SAL) de EMP où SAL PAS IN (SELECT (SAL) de EMP) CODE> P>
La question dit sans utiliser de sous-requête
Essayez ceci. Il peut très facile de trouver des éléments de nième rang en utilisant CTE
** ** ** p> p>
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
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;
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;
SELECT salery,name FROM employ ORDER BY salery DESC limit 1, OFFSET n
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
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 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
Ce n'est pas valide dans SQL Server.
6- façons d'écrire un deuxième salaire le plus élevé. ** p>
1.Sélectionnez * de l'ordre de l'employé par salaire descendez 1 rangs Fetch Suivant 1 rangée uniquement P>
2.Sélectionnez Max (salaire) de l'employé où salaire <(Sélectionnez Max (salaire) de l'employé) P>
3.Sélectionnez Max (salaire) de l'employé où salaire n'est pas dans (Sélectionnez Max (salaire) de l'employé); P>
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 P>
6.Sélectionnez Max (E1.Salary) de l'employé E1, employé E2 où E1.Salaire
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
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 i> 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 ).