Comment trouver le third or nth
salaire maximum du salaire table(EmpID,EmpName,EmpSalary)
de manière optimisée?
Comment trouver le third or nth
salaire maximum du salaire table(EmpID,EmpName,EmpSalary)
de manière optimisée?
Réponses:
Utilisez ROW_NUMBER
(si vous en 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
EmpSalary
colonne. Aussi, réduit par rapport à quoi? L'avantage de l' ROW_NUMBER
approche est que vous pouvez l'utiliser ..OVER(PARTITION BY GroupColumn OrderBy OrderColumn)
. Vous pouvez donc l'utiliser pour obtenir des groupes tout en accédant à n'importe quelle colonne.
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
... WHERE (N-1) = (Subquery)...
travaux. La sous-requête est une requête corrélée puisque sa WHERE
clause utilise Emp1
de la requête principale. La sous-requête est évaluée chaque fois que la requête principale analyse une ligne. Exemple, si nous devons trouver le 3ème salaire le plus élevé (N = 3) à partir de (800, 1000, 700, 750), la sous-requête de la 1ère ligne sera SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
égale à 0. Pour la 4ème valeur de salaire (750) ... WHERE Emp2.Salary > 750
sera 2, ou N -1, donc cette ligne sera retournée.
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 la manière, utilisez le TOP
mot-clé, donc la nième requête sur les salaires maximum et minimum comme suit, mais les requêtes semblent difficiles comme dans l'ordre inverse en utilisant des noms de fonction d'agrégation:
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 modifier la nième valeur après la contrainte LIMIT.
Ici, la sous-requête Sélectionnez EmpSalary à partir de la commande des employés par EmpSalary DESC Limit 3; retournerait les 3 meilleurs salaires des employés. À partir du résultat, nous choisirons le salaire minimum en utilisant 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 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
... WHERE (N-1) = (Subquery)...
travaux. La sous-requête est une requête corrélée puisque sa WHERE
clause utilise Emp1
de la requête principale. La sous-requête est évaluée chaque fois que la requête principale analyse une ligne. Exemple, si nous devons trouver le 3ème salaire le plus élevé (N = 3) à partir de (800, 1000, 700, 750), la sous-requête de la 1ère ligne sera SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
égale à 0. Pour la 4ème valeur de salaire (750) ... WHERE Emp2.Salary > 750
sera 2, ou N -1, donc cette ligne sera retournée.
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 3e 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
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é de MYSQL. Si vous souhaitez 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;
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
En 2008, nous pouvons utiliser ROW_NUMBER () OVER (ORDER BY EmpSalary DESC) pour obtenir un rang sans égalité que nous pouvons utiliser.
Par exemple, nous pouvons obtenir le 8ème plus haut de cette façon, ou changer @N en autre chose 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;
Dans SQL Server 2012, comme vous le savez peut-être, cela est effectué 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
C'est l'une des questions les plus fréquentes dans toute interview 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 ce tableau en exécutant ci-dessous une instruction d'insertion.
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)
Nous allons maintenant trouver le 3e Basic_sal le plus élevé du tableau ci-dessus en utilisant différentes requêtes. J'ai exécuté la requête ci-dessous dans le studio de gestion et ci-dessous est le résultat.
select * from Employee order by Basic_Sal desc
Nous pouvons voir dans l'image ci-dessus que le 3e salaire de base le plus élevé serait de 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, soit 8500.
Première manière: - Utilisation de 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
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 3e salaire le plus élevé
SELECT MIN(COLUMN_NAME)
FROM (
SELECT DISTINCT TOP 3 COLUMN_NAME
FROM TABLE_NAME
ORDER BY
COLUMN_NAME DESC
) AS 'COLUMN_NAME'
--nième salaire le plus élevé
select *
from (select lstName, salary, row_number() over( order by salary desc) as rn
from employee) tmp
where rn = 2
- (nième -1) salaire le plus élevé
select *
from employee e1
where 1 = (select count(distinct salary)
from employee e2
where e2.Salary > e1.Salary )
Méthode optimisée: au lieu de sous-requête, utilisez simplement limit.
select distinct salary from employee order by salary desc limit nth, 1;
Voir la syntaxe des limites ici http://www.mysqltutorial.org/mysql-limit.aspx
Pour obtenir la troisième valeur la plus élevée de la table
SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
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
Essayez ce code: -
SELECT *
FROM one one1
WHERE ( n ) = ( SELECT COUNT( one2.salary )
FROM one one2
WHERE one2.salary >= one1.salary
)
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);
Remplacez n par le nième salaire le plus élevé comme nombre.
Essaye celui-là...
SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
SELECT * FROM (sélectionnez le salaire distinct des clients par ordre de salaire DESC) limite 4,1;
Limiter 4,1 signifie laisser les 4 premières lignes, puis sélectionner la suivante.
La limite et le nombre de rang dépendent de la plate-forme que vous utilisez.
Essayez ceci, cela fonctionnera.
REMARQUE: veuillez remplacer OFFSET 3 dans la requête par TOUT Nième nombre entier
SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS
FETCH NEXT 1 ROWS ONLY
La description
RECHERCHEZ UNIQUEMENT LES 1 RANGÉES SUIVANTES
retourne seulement 1 ligne
OFFSET 3 RANGÉES
exclure les 3 premiers enregistrements Ici vous pouvez vous n'importe quel nombre entier
Les sous-requêtes prennent toujours plus de temps:
utilisez la requête ci-dessous pour obtenir les données les plus élevées 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 des nièmes données.