Comment trouver le salaire maximum third or nth
à partir du salaire table(EmpID,EmpName,EmpSalary)
de manière optimisée?
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
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
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 ...
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)
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é.
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
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
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
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
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.
SELECT EmpSalary
FROM salary_table
GROUP BY EmpSalary
ORDER BY EmpSalary DESC LIMIT n-1, 1;
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 ().
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR ORDER BY GRN_NAME DESC
print @maxNthSal
--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 )
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
SELECT MIN(COLUMN_NAME)
FROM (
SELECT DISTINCT TOP 3 COLUMN_NAME
FROM TABLE_NAME
ORDER BY
COLUMN_NAME DESC
) AS 'COLUMN_NAME'
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
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
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)
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
set @n = $n
SELECT a.* FROM ( select a.* , @rn = @rn+1 from EMPLOYEE order by a.EmpSalary desc ) As a where rn = @n
Pour obtenir la troisième plus haute valeur de la table
SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
Essayez ce code: -
SELECT *
FROM one one1
WHERE ( n ) = ( SELECT COUNT( one2.salary )
FROM one one2
WHERE one2.salary >= one1.salary
)
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);
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)
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
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 ().
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
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
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
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
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 ....
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.
Essaye celui-là...
SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
select min(salary)
from (select salary
from employee
where rownum < n+1
order by salary desc);
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
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.
// 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)