¿Cómo encontrar el third or nth
salario máximo del salario table(EmpID,EmpName,EmpSalary)
de manera optimizada?
¿Cómo encontrar el third or nth
salario máximo del salario table(EmpID,EmpName,EmpSalary)
de manera optimizada?
Respuestas:
Utilice ROW_NUMBER
(si desea uno) o DENSE_RANK
(para todas las filas relacionadas):
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
columna. Además, ¿reducido en comparación con qué? La ventaja del ROW_NUMBER
enfoque es que puede utilizar ..OVER(PARTITION BY GroupColumn OrderBy OrderColumn)
. Por lo tanto, puede usarlo para obtener grupos pero aún acceder a cualquier columna de él.
Numero de fila :
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)
Consulta secundaria:
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary
)
Palabra clave principal:
SELECT TOP 1 salary
FROM (
SELECT DISTINCT TOP n salary
FROM employee
ORDER BY salary DESC
) a
ORDER BY salary
... WHERE (N-1) = (Subquery)...
funciona. La subconsulta es una consulta correlacionada ya que su WHERE
cláusula usa Emp1
de la consulta principal. La subconsulta se evalúa cada vez que la consulta principal escanea una fila. Por ejemplo, si vamos a encontrar el tercer salario más grande (N = 3) de (800, 1000, 700, 750), la subconsulta para la primera fila sería SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
cuál es 0. Para el cuarto salario, el valor (750) ... WHERE Emp2.Salary > 750
será 2, o N -1, por lo tanto, se devolverá esta fila.
Si desea optimizar la forma significa usar TOP
palabra clave, por lo que la enésima consulta de salarios máximos y mínimos de la siguiente manera, pero las consultas parecen complicadas, ya que están en orden inverso al usar nombres de funciones agregadas:
N salario máximo:
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC)
por ejemplo: 3 salario máximo:
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC)
N salario mínimo:
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary ASC)
por ejemplo: 3 salario mínimo:
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary ASC)
¡Demasiado simple si usa la subconsulta!
SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);
Aquí puede cambiar el enésimo valor después de la restricción LIMIT.
Aquí en esta subconsulta Seleccione EmpSalary de Pedido de empleado por EmpSalary DESC Límite 3; devolvería los 3 salarios superiores de los Empleados. Del resultado elegiremos el salario mínimo usando el comando MIN para obtener el tercer salario TOP del empleado.
Reemplaza N con tu número máximo
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
Explicación
La consulta anterior puede ser bastante confusa si no ha visto nada parecido antes: la consulta interna es lo que se llama una subconsulta correlacionada porque la consulta interna (la subconsulta) usa un valor de la consulta externa (en este caso, la tabla Emp1 ) en su cláusula WHERE.
Y fuente
... WHERE (N-1) = (Subquery)...
funciona. La subconsulta es una consulta correlacionada ya que su WHERE
cláusula usa Emp1
de la consulta principal. La subconsulta se evalúa cada vez que la consulta principal escanea una fila. Por ejemplo, si vamos a encontrar el tercer salario más grande (N = 3) de (800, 1000, 700, 750), la subconsulta para la primera fila sería SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
cuál es 0. Para el cuarto salario, el valor (750) ... WHERE Emp2.Salary > 750
será 2, o N -1, por lo tanto, se devolverá esta fila.
Tercer o enésimo salario máximo de la tabla de salarios sin usar subconsulta
select salary from salary
ORDER BY salary DESC
OFFSET N-1 ROWS
FETCH NEXT 1 ROWS ONLY
Para el tercer salario más alto, coloque 2 en lugar de N-1
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
Consulte la siguiente consulta para obtener el enésimo salario más alto. De esta manera, obtiene el enésimo salario más alto en MYSQL. Si desea obtener el enésimo salario más bajo, solo debe reemplazar DESC por ASC en la consulta.
SELECT EmpSalary
FROM salary_table
GROUP BY EmpSalary
ORDER BY EmpSalary DESC LIMIT n-1, 1;
Método 1:
SELECT TOP 1 salary FROM (
SELECT TOP 3 salary
FROM employees
ORDER BY salary DESC) AS emp
ORDER BY salary ASC
Método 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 podemos usar ROW_NUMBER () OVER (ORDER BY EmpSalary DESC) para obtener un rango sin empates que podamos usar.
Por ejemplo, podemos obtener el octavo más alto de esta manera, o cambiar @N a otra cosa o usarlo como parámetro en una función si lo desea.
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;
En SQL Server 2012, como ya sabrá, esto se realiza de forma más intuitiva utilizando LAG ().
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR ORDER BY GRN_NAME DESC
print @maxNthSal
Esta es una de las preguntas más populares en cualquier entrevista SQL. Voy a escribir diferentes consultas para encontrar el enésimo valor más alto de una columna.
He creado una tabla llamada "Emloyee" ejecutando el siguiente script.
CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)
Ahora voy a insertar 8 filas en esta tabla ejecutando debajo de la declaración de inserción.
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)
Ahora encontraremos el tercer Basic_sal más alto de la tabla anterior usando diferentes consultas. He ejecutado la siguiente consulta en Management Studio y a continuación se muestra el resultado.
select * from Employee order by Basic_Sal desc
Podemos ver en la imagen de arriba que el tercer salario básico más alto sería 8500. Estoy escribiendo 3 formas diferentes de hacer lo mismo. Al ejecutar las tres consultas mencionadas a continuación, obtendremos el mismo resultado, es decir, 8500.
Primera forma: - Uso de la función de número de fila
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;
Estoy mostrando el tercer salario más alto
SELECT MIN(COLUMN_NAME)
FROM (
SELECT DISTINCT TOP 3 COLUMN_NAME
FROM TABLE_NAME
ORDER BY
COLUMN_NAME DESC
) AS 'COLUMN_NAME'
- el décimo salario más alto
select *
from (select lstName, salary, row_number() over( order by salary desc) as rn
from employee) tmp
where rn = 2
- (n-ésimo -1) salario más alto
select *
from employee e1
where 1 = (select count(distinct salary)
from employee e2
where e2.Salary > e1.Salary )
Manera optimizada: en lugar de subconsultas, simplemente use limit.
select distinct salary from employee order by salary desc limit nth, 1;
Consulte la sintaxis de límite aquí http://www.mysqltutorial.org/mysql-limit.aspx
Para obtener el tercer valor más alto de la tabla
SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
Por subconsulta:
SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)
Prueba esta consulta
SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary)
FROM emp WHERE E.salary <= salary)
Pon n = qué valor quieres
set @n = $n
SELECT a.* FROM ( select a.* , @rn = @rn+1 from EMPLOYEE order by a.EmpSalary desc ) As a where rn = @n
Prueba este código: -
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);
Reemplaza n con el enésimo salario más alto como número.
Prueba este ...
SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
SELECCIONAR * DE (seleccionar Salario distinto de Clientes ordenar por salario DESC) límite 4,1;
El límite 4,1 significa dejar las primeras 4 filas y luego seleccionar la siguiente.
El límite y el número de filas dependen de la plataforma que esté utilizando.
Prueba esto, funcionará.
NOTA: Reemplace OFFSET 3 en Consulta con CUALQUIER N-ésimo número entero
SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS
FETCH NEXT 1 ROWS ONLY
Descripción
BUSCAR SIGUIENTE 1 FILAS SOLAMENTE
devuelve solo 1 fila
OFFSET 3 FILAS
excluir los primeros 3 registros Aquí puede cualquier número entero
Las subconsultas siempre toman más tiempo:
use la siguiente consulta para obtener los datos más altos y más bajos:
Datos más altos: select *from business order by id desc limit 3,1;
Datos más bajos: select *from business order by id asc limit 3,1;
Puede usar N en lugar de 3 para obtener n-ésimo dato.