web-dev-qa-db-fra.com

Comment trouver le troisième ou le nième salaire maximum dans le tableau des salaires?

Comment trouver le salaire maximum third or nth à partir du salaire table(EmpID,EmpName,EmpSalary) de manière optimisée?

87
Karan Gandhi

Utilisez ROW_NUMBER (si vous voulez un seul) ou DENSE_RANK (pour toutes les lignes associées):

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
70
Rango

Numéro de ligne:

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)

Requête secondaire:

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

Top mot clé:

SELECT TOP 1 salary
FROM (
      SELECT DISTINCT TOP n salary
      FROM employee
      ORDER BY salary DESC
      ) a
ORDER BY salary
79
Kumar Manish-PMP

Essaye ça 

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

Pour 3, vous pouvez remplacer n'importe quelle valeur ...

48
Codesen

Si vous voulez optimiser, cela signifie que vous utilisez la variable TOP Mot-clé, donc la requête nième des salaires maximum et minimum comme suit, mais les requêtes semblent difficiles comme dans l'ordre inverse en utilisant des noms de fonctions agrégées:

N salaire maximum:

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

pour Ex: 3 salaire maximum:

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

N salaire minimum:

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

pour Ex: 3 salaire minimum:

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

Trop simple si vous utilisez la sous-requête!

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

Vous pouvez ici simplement changer la nième valeur après la contrainte LIMIT.

Ici, dans la sous-requête, sélectionnez EmpSalary dans l'ordre des employés par EmpSalary DESC Limite 3; retournerait le top 3 des salaires des employés. Sur le résultat, nous choisirons le salaire minimum à l'aide de la commande MIN pour obtenir le 3ème salaire TOP de l'employé.

12
devutkarsh

Remplacez N par votre nombre maximum

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

Explication

La requête ci-dessus peut être assez déroutante si vous n'avez jamais rien vu de tel auparavant. La requête interne est ce qu'on appelle une sous-requête corrélée, car la requête interne (la sous-requête) utilise une valeur de la requête externe (dans ce cas, la table Emp1 ) dans sa clause WHERE.

Et Source

12
Luv

Troisième ou nième salaire maximum de la table des salaires sans utiliser de sous-requête 

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

Pour le troisième salaire le plus élevé, mettez 2 à la place de N-1

11
Darvi Sunny
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
10
Pankaj Gaikwad

Méthode 1:

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

Méthode 2:

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

Reportez-vous à la requête suivante pour obtenir le nième salaire le plus élevé. De cette façon, vous obtenez le nième salaire le plus élevé dans MYSQL. Si vous voulez obtenir le nième salaire le plus bas, vous devez remplacer DESC par ASC dans la requête. nth highest salary

5
Vijay Bhatt
SELECT EmpSalary 
FROM salary_table 
GROUP BY EmpSalary 
ORDER BY EmpSalary DESC LIMIT n-1, 1;
4

En 2008, nous pouvons utiliser ROW_NUMBER () OVER (ORDER BY EmpSalary DESC) pour obtenir un classement sans liens que nous pouvons utiliser.

Par exemple, nous pouvons obtenir le 8ème plus haut de cette façon, ou remplacer @N par quelque chose d'autre ou l'utiliser comme paramètre dans une fonction si vous le souhaitez.

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;

Comme vous le savez peut-être, cela se produit dans SQL Server 2012 de manière plus intuitive à l'aide de LAG ().

4
David Söderlund
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR   ORDER BY GRN_NAME DESC
print @maxNthSal
3

--le salaire le plus élevé 

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

- (n-1) salaire le plus élevé

select * 
from employee e1
where 1 = (select count(distinct salary)  
           from employee e2
           where e2.Salary > e1.Salary )
3
Surya
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;

Je montre le 3ème plus haut salaire

3
kiran lanke
SELECT MIN(COLUMN_NAME)
FROM   (
           SELECT DISTINCT TOP 3     COLUMN_NAME
           FROM   TABLE_NAME
           ORDER BY
                  COLUMN_NAME        DESC
       ) AS 'COLUMN_NAME'
3
Vikas Joshi

C’est l’une des questions les plus courantes dans toutes les interviews SQL. Je vais écrire différentes requêtes pour connaître la nième valeur la plus élevée d'une colonne.

J'ai créé une table nommée "Emloyee" en exécutant le script ci-dessous.

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

Maintenant, je vais insérer 8 lignes dans cette table en exécutant la commande ci-dessous.

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)

Maintenant, nous allons découvrir la 3ème plus grande base_sal du tableau ci-dessus en utilisant différentes requêtes . J'ai exécuté la requête ci-dessous dans studio de gestion et voici le résultat.

select * from Employee order by Basic_Sal desc

Nous pouvons voir dans l'image ci-dessus que le 3ème plus haut salaire de base serait 8500. J'écris 3 façons différentes de faire la même chose. En exécutant les trois requêtes mentionnées ci-dessous, nous obtiendrons le même résultat, à savoir 8500.

Première manière: - Utiliser la fonction de numéro de ligne

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
3

Manière optimisée: au lieu de sous-requête, utilisez simplement la limite.

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

Voir limite de syntaxe ici http://www.mysqltutorial.org/mysql-limit.aspx

2
Kishor Vitekar

Par sous-requête:

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

Essayez cette requête

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

Mettez n = quelle valeur vous voulez

1
Mayur Sawant
set @n = $n

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

Pour obtenir la troisième plus haute valeur de la table 

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

Essayez ce code: -

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

Solution testée par MySQL, supposons que N = 4:

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

Un autre exemple:

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

un autre moyen de trouver les dernières données les plus élevées en fonction de la date 

SELECT A.JID,A.EntryDate,RefundDate,Comments,Refund, ActionBy FROM (
(select JID, Max(EntryDate) AS EntryDate from refundrequested GROUP BY JID) A 
Inner JOIN (SELECT JID,ENTRYDATE,refundDate,Comments,refund,ActionBy from refundrequested) B 
ON A.JID=B.JID AND A.EntryDate = B.EntryDate) 
0
Thomas

trouver la Nième valeur maximale à l'aide des fonctions CTE et FIRST_VALUE. - 5ème salaire maximum

;WITH CTE_NTH_SAL AS 
    (SELECT FIRST_VALUE(ESAL) OVER(ORDER BY ESAL DESC) AS ESAL,
        1 AS ID
    FROM EMPLOYEE
    UNION ALL
    SELECT FIRST_VALUE(EMP.ESAL) OVER(ORDER BY EMP.ESAL DESC) AS ESAL,
        ID
    FROM EMPLOYEE EMP,
        (SELECT ESAL,
        ID+1 AS ID
        FROM CTE_NTH_SAL) CTE_NTH_SAL
        WHERE EMP.ESAL<CTE_NTH_SAL.ESAL
                AND CTE_NTH_SAL.ID<=5 )
    SELECT DISTINCT ESAL
FROM CTE_NTH_SAL
WHERE ID=5

pour un exemple de résultat et plus de manières clickhere

0
Mahesh

Trouvez le nième salaire le plus élevé d'une table. Voici un moyen de faire cette tâche en utilisant la fonction dense_rank ().

 enter image description here

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 calcule le rang d'une ligne dans un groupe de lignes ordonné et renvoie le rang sous forme de NUMBER. Les rangs sont des entiers consécutifs commençant par 1 . 2. Cette fonction accepte les arguments comme n'importe quel type de données numériques et renvoie NUMBER . 3. En tant que fonction analytique, DENSE_RANK calcule le rang de chaque ligne renvoyée par une requête par rapport aux autres lignes, en fonction des valeurs de value_exprs dans la commande order_by_clause . 4. Dans la requête ci-dessus, le classement est renvoyé en fonction de la table sal de la table employee. En cas d'égalité, il attribue un rang égal à toutes les lignes.

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
0
Fezal halai

NOTE: S'il vous plaît remplacer OFFSET 3dans la requête avec N'IMPORTE Nième nombre entier 

SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS 
FETCH NEXT 1 ROWS ONLY

La description 

FETCH NEXT 1 ROWS UNIQUEMENT

renvoyer une seule ligne 

OFFSET 3 ROWS

exclure les 3 premiers enregistrements Ici, vous pouvez utiliser n'importe quel nombre entier 

0
Hardik Masalawala

Vous pouvez essayer ceci:

select top(1) EXPORT_NO
from DC_HDR 
order by CASE when  (ROW_NUMBER() over(order by EXPORT_NO desc))=3 then EXPORT_NO else 0 end desc
0

Pour interroger le nth highest bonus, dites n=10, utilisez AdventureWorks2012, essayez le code suivant.

USE AdventureWorks2012; 
GO

SELECT * FROM Sales.SalesPerson;
GO

DECLARE @grade INT;
SET @grade = 10;
SELECT MIN(Bonus)
FROM (SELECT TOP (@grade) Bonus FROM (SELECT DISTINCT(Bonus) FROM Sales.SalesPerson) AS a ORDER BY Bonus DESC) AS g
0
Mahabubul Islam
select 
    Min(salary) 
from ( select salary from employees order by salary desc) t
where rownum<=3;

Pour le 2ème salaire le plus élevé, changer 3 à 2 dans la requête ci-dessus et pour le Nème salaire le plus élevé, passer à N où N = 1,2,3,4 ....

0
user2603985

SELECT * FROM (sélectionne le salaire distinct des clients par ordre de salaire DESC) limite 4,1;

Limite 4,1 signifie laisser les 4 premières lignes puis sélectionner la suivante.

La limite et le nombre indiqué dépendent de la plate-forme que vous utilisez.

Essayez ceci, ça va marcher.

0
Saif Grover

Essaye celui-là...

SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
0
Deepak Kumar
select min(salary) 
from (select salary 
      from employee 
      where rownum < n+1 
      order by salary desc);
0
Ashok Ogirala

Montrant tous les 3ème salaire le plus élevé: 

select * from emp where sal=
(SELECT DISTINCT sal FROM emp ORDER BY sal DESC LIMIT 3,1) ;

Montrant seulement le 3ème salaire le plus élevé:

SELECT DISTINCT sal FROM emp ORDER BY sal DESC LIMIT 3,1
0
Gobi

Les sous-requêtes prennent toujours plus de temps:

utilisez la requête ci-dessous pour obtenir les données les plus hautes et les plus basses:

Données les plus élevées: select *from business order by id desc limit 3,1; 

Données les plus basses: select *from business order by id asc limit 3,1; 

Peut utiliser N à la place de 3 pour obtenir les nièmes données.

0
Ankit Gupta

// vous pouvez trouver le nième salaire de la table.Si vous voulez récupérer le 2e salaire le plus élevé, mettez n = 2, si la 3e heure, sortez n = 3, etc.

SELECT *  FROM tablename t1 
WHERE (N-1) = (SELECT COUNT(DISTINCT(t2.Salary)) 
 FROM tablename t2
WHERE t2.Salary > t1.Salary)
0
Mukesh Kumar