¿Cómo encontrar el tercer o enésimo salario máximo de la tabla de salarios?


Respuestas:


82

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

¿Cómo obtener el registro de salario mínimo de la tabla? seleccione ins.KYS_ID, ins.FKYS_INS_ID de cmn_pat_x_insurance ins donde ins.FKYS_PAT_ID = '1253_717' e ins.FKYS_INS_TYPE en (1) e ins.BOL_TYPE en (1,3) e ins.salary en (min (ins.salary))
saidesh kilaru

Imagínese, hay 10,0000 registros en la tabla de empleados. Si utilizo la consulta anterior, el rendimiento se reducirá de 6 a 10 veces.
Bimal Das

1
@BimalDas: entonces no tienes un índice en la EmpSalarycolumna. Además, ¿reducido en comparación con qué? La ventaja del ROW_NUMBERenfoque 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.
Tim Schmelter

@TimSchmelter WITH CTE creará una tabla temporal para almacenar los datos completos de la primera instrucción SELECT en ella, luego del resultado seleccionamos "SELECT EmpID, EmpName, EmpSalary FROM CTE WHERE RN = @NthRow". Por eso supongo que es un poco lento. Yo lo revisé. y también tengo una indexación adecuada.
Bimal Das

2
@BimalDas: No, no está creando una tabla temporal. Normalmente, un cte no se materializa en ninguna parte. Es más como una vista en línea o una subconsulta con nombre.
Tim Schmelter

88

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

¿Cómo obtener el registro de salario mínimo de la tabla? seleccione ins.KYS_ID, ins.FKYS_INS_ID de cmn_pat_x_insurance ins donde ins.FKYS_PAT_ID = '1253_717' e ins.FKYS_INS_TYPE en (1) e ins.BOL_TYPE en (1,3) e ins.salary en (min (ins.salary))
saidesh kilaru

Kumar y Alexander, quiero obtener un campo más con él, ¿cómo hacerlo? mi consulta es como "" "Seleccione Top 1 NoteID de (Seleccione DateDiff (Year, SchedualDate, Current_TimeStamp) como NoteAge, Distinct Top 3 NoteID de [dbo]. [DocSecheduale] Ordenar por NoteID Desc) un Orden por NoteID" ""
Zaveed Abbasi

Estoy encontrando el enésimo salario más alto, pero estoy obteniendo complejidad para entender la subconsulta, ¿le gustaría explicar la subconsulta ...?
Deepak Gupta

@deepak_java la subconsulta se evalúa cada vez que la consulta externa procesa una fila. En otras palabras, la consulta interna no se puede procesar independientemente de la consulta externa, ya que la consulta interna también usa el valor Emp1.
Kumar Manish

Es importante entender por qué ... WHERE (N-1) = (Subquery)...funciona. La subconsulta es una consulta correlacionada ya que su WHEREcláusula usa Emp1de 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 > 800cuál es 0. Para el cuarto salario, el valor (750) ... WHERE Emp2.Salary > 750será 2, o N -1, por lo tanto, se devolverá esta fila.
jerrymouse

65

Prueba esto

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

Por 3 puedes reemplazar cualquier valor ...


¿Funciona esto con Oracle 10g o 11g? ¿O hay una alternativa tan bonita como esta?
RBz

40

Si desea optimizar la forma significa usar TOPpalabra 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)

El más simple y fácil de recordar. +1
Sнаđошƒаӽ

4
para obtener el salario máximo por qué lo estamos haciendo en orden ASC, debe hacerse en orden DESC, si tenemos un salario como este 7000,10000,11000,500,800,900,12000, la consulta interna de clasificación dará como resultado top3, lo que significa 500,800,900 y el máximo de estos es 900, pero 900 no es el 3 máximo, 3 el salario máximo es 10000.
Narendra Jaggi

1
por ejemplo: 3 salarios máximos: tiene que ser así SELECCIONAR Min (EmpSalary) FROM Salario DONDE EmpSalary IN (SELECCIONAR TOP 3 EmpSalary FROM Salario ORDEN POR EmpSalary DESC)
Jimit Rupani

15

¡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.


Obteniendo este error. Código de error: 1248 Cada tabla derivada debe tener su propio alias

agregue un alias a él. SELECT MIN (EmpSalary) de (SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3) como s;
anonxss

Simplemente use DISTINCT para evitar duplicados SELECT MIN (EmpSalary) de (SELECT DISTINCT (EmpSalary) from Employee ORDER BY EmpSalary DESC LIMIT 3);
Kalpesh Parikh

14

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


+1 Es importante entender por qué ... WHERE (N-1) = (Subquery)...funciona. La subconsulta es una consulta correlacionada ya que su WHEREcláusula usa Emp1de 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 > 800cuál es 0. Para el cuarto salario, el valor (750) ... WHERE Emp2.Salary > 750será 2, o N -1, por lo tanto, se devolverá esta fila.
jerrymouse

13

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


3
Es importante mencionar que OFFSET FETCH está disponible en la versión SQL Server 2012 +.
Zerotoinfinity

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

1
Gracias por DENSE_RANK () nunca había oído hablar de él
Vivekh

8

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. enésimo salario más alto


1
La pregunta es sobre SQL-Server, no sobre MySQL.
bummi


6

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

El método 1 se puede ordenar: SELECCIONE 1 SALARIO PRINCIPAL DE (SELECCIONE 3 SALARIO PRINCIPAL DE EMPLEADOS) * motivo: porque de forma predeterminada su orden ascendente
Ashish Agrawal Yodlee

5

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 ().


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

Potencialmente cambiar impresión para seleccionar
Tomas Pastircak

3

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

3
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


3
SELECT MIN(COLUMN_NAME)
FROM   (
           SELECT DISTINCT TOP 3     COLUMN_NAME
           FROM   TABLE_NAME
           ORDER BY
                  COLUMN_NAME        DESC
       ) AS 'COLUMN_NAME'

3

- 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 )


3

Para obtener el tercer valor más alto de la tabla

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

SELECCIONAR Nombre de columna distinto de nombre de tabla ORDENAR POR nombre de columna LÍMITE DE DESC 2, 1
Devendra Singraul

2

Por subconsulta:

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

1

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


1
set @n = $n

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

1

Solución probada de MySQL, suponga N = 4:

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

Otro ejemplo:

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

1

Prueba este código: -

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

1
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.


0

Prueba este ...

SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)

0
select 
    Min(salary) 
from ( select salary from employees order by salary desc) t
where rownum<=3;

Para el segundo salario más alto, cambie 3 a 2 en la consulta anterior y para el enésimo salario más alto a N, donde N = 1,2,3,4 ....


0

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á.


0

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


0

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.