it-swarm-es.com

Consulta para encontrar el enésimo valor máximo de una columna

Quiero encontrar el segundo, tercer ... décimo valor máximo de una columna

24
kiritsinh parmar

Puede ordenar la columna en formato descendente y luego obtener el valor de la enésima fila.

EDITAR::

Actualizado según la solicitud de comentarios. [~ # ~] advertencia [~ # ~] completamente sin probar!

SELECT DOB FROM (SELECT DOB FROM USERS ORDER BY DOB DESC) WHERE ROWID = 6

Algo como lo anterior debería funcionar para Oracle ... ¡es posible que primero tenga que obtener la sintaxis correcta!

11
TK.

Considere la siguiente tabla de empleados con una sola columna para el salario.

 + ------ + 
 | Sal | 
 + ------ + 
 | 3500 | 
 | 2500 | 
 | 2500 | 
 | 5500 | 
 | 7500 | 
 + ------ + 

La siguiente consulta devolverá el enésimo elemento máximo.

select SAL from EMPLOYEE E1 where 
 (N - 1) = (select count(distinct(SAL)) 
            from EMPLOYEE E2 
            where E2.SAL > E1.SAL )

Por ej. cuando se requiere el segundo valor máximo,

  select SAL from EMPLOYEE E1 where 
     (2 - 1) = (select count(distinct(SAL)) 
                from EMPLOYEE E2 
                where E2.SAL > E1.SAL )
 + ------ + 
 | Sal | 
 + ------ + 
 | 5500 | 
 + ------ + 
30
dexter

No especificó qué base de datos, en MySQL puede hacer

SELECT column FROM table ORDER BY column DESC LIMIT 7,10;

Omitiría los primeros 7 y luego obtendría los siguientes diez más altos.

8
Pieter

Una vez más, es posible que deba corregir su base de datos, pero si desea el segundo valor superior en un conjunto de datos que potencialmente tiene el valor duplicado, también querrá hacer un grupo:

SELECT column 
FROM table 
WHERE column IS NOT NULL 
GROUP BY column 
ORDER BY column DESC 
LIMIT 5 OFFSET 2;

Omitiría los dos primeros, y luego obtendrá los siguientes cinco más altos.

6
Steven Dickinson

SQL puro (nota: recomendaría usar características SQL específicas de su DBMS ya que probablemente será más eficiente). Esto te dará el n + 1º valor más grande (para obtener el más pequeño, voltea el <). Si tiene duplicados, hágalo CONTEO (VALOR DISTINTO).

select id from table order by id desc limit 4 ;
+------+
| id   |
+------+
| 2211 | 
| 2210 | 
| 2209 | 
| 2208 | 
+------+


SELECT yourvalue
  FROM yourtable t1
 WHERE EXISTS( SELECT COUNT(*)
                 FROM yourtable t2
                WHERE t1.id       <> t2.id
                  AND t1.yourvalue < t2.yourvalue
               HAVING COUNT(*) = 3 )


+------+
| id   |
+------+
| 2208 | 
+------+
5
Matt Rogish

(Nombre de la tabla = Estudiante, Nombre de la columna = marca)

select * from(select row_number() over (order by mark desc) as t,mark from student group by mark) as td where t=4
3
German Alex

Puede encontrar el enésimo valor más grande de columna mediante la siguiente consulta:

SELECT * FROM TableName a WHERE
    n = (SELECT count(DISTINCT(b.ColumnName)) 
    FROM TableName b WHERE a.ColumnName <=b.ColumnName);
2
Abhishek B Patel
Select max(sal) 
from table t1 
where N (select max(sal) 
        from table t2 
        where t2.sal > t1.sal)

Para encontrar la enésima sal máxima.

1
Piyush
select column_name from table_name 
order by column_name desc limit n-1,1;

donde n = 1, 2, 3, .... enésimo valor máximo.

1
rashedcs

Aquí hay un método para Oracle. Este ejemplo obtiene el noveno valor más alto. Simplemente reemplace el 9 con una variable de enlace que contenga la posición que está buscando.

   select created from (
     select created from (
       select created from user_objects
         order by created desc
       )
       where rownum <= 9
       order by created asc
     )
     where rownum = 1

Si desea el enésimo valor único, agregaría DISTINCT en el bloque de consulta más interno.

1
Dave Costa

Solo busqué esta pregunta cuando busqué la respuesta yo mismo, y esto parece funcionar para SQL Server 2005 (derivado de solución de Blorgbeard ):

SELECT MIN(q.col1) FROM (
    SELECT
        DISTINCT TOP n col1
        FROM myTable
        ORDER BY col1 DESC
) q;

Efectivamente, esa es una SELECT MIN(q.someCol) FROM someTable q, con la parte superior n de la tabla recuperada por la consulta SELECT DISTINCT....

1
Phil H

Esta es una consulta para obtener el enésimo más alto desde la columna n = 0 para el segundo más alto y n = 1 para el tercer más alto y así sucesivamente ...

 SELECT * FROM TableName
 WHERE ColomnName<(select max(ColomnName) from TableName)-n order by ColomnName desc limit 1;
SELECT * FROM tablename 
WHERE columnname<(select max(columnname) from tablename) 
order by columnname desc limit 1
1
shankar

MySQL:

select distinct(salary) from employee order by salary desc limit (n-1), 1;
0
Ritesh

(TableName = Estudiante, ColumnName = Marca):

select *
from student 
where mark=(select mark 
            from(select row_number() over (order by mark desc) as t,
                 mark 
                 from student group by mark) as td 
            where t=2)
0
German Alex

Creo que la consulta a continuación funcionará perfectamente en Oracle sql ... Lo he probado yo mismo ...

Información relacionada con esta consulta: esta consulta utiliza dos tablas llamadas employee y department con columnas en el nombre del empleado: name (nombre del empleado), dept_id (común a empleados y departamento), salary

Y columnas en la tabla del departamento: dept_id (común también para la tabla de empleados), dept_name

SELECT
  tab.dept_name,MIN(tab.salary) AS Second_Max_Sal FROM (
    SELECT e.name, e.salary, d.dept_name, dense_rank() over (partition BY  d.dept_name          ORDER BY e.salary)  AS   rank FROM department d JOIN employee e USING (dept_id) )  tab
 WHERE
   rank  BETWEEN 1 AND 2
 GROUP BY
   tab.dept_name

gracias

0
ria

Solución para encontrar el enésimo valor máximo de una columna en particular en SQL Server:

Mesa de empleados:

Employee Table

Tabla de ventas:

Sales Table

Datos de la tabla de empleados:

==========
Id  name
=========
6   ARSHAD M
7   Manu
8   Shaji

Datos de la tabla de ventas:

=================
id  emp_id   amount
=================
1   6        500
2   7        100
3   8        100
4   6        150
5   7        130
6   7        130
7   7        330

Consulta para conocer los detalles de un empleado que tiene la mayor venta/ N vendedor más alto

select * from (select E.Id,E.name,SUM(S.amount) AS 'total_amount' from employee E INNER JOIN Sale S on E.Id=S.emp_id group by S.emp_id,E.Id,E.name ) AS T1 WHERE(0)=( select COUNT(DISTINCT(total_amount)) from(select E.Id,E.name,SUM(S.amount) AS 'total_amount' from employee E INNER JOIN Sale S on E.Id=S.emp_id group by S.emp_id,E.Id,E.name )AS T2 WHERE(T1.total_amount<T2.total_amount) );

En WHERE (0) reemplaza 0 por n-1

Resultado:

========================
id  name    total_amount
========================
7   Manu    690
0
ARSHAD M

Puedes simplificar así

SELECT MIN(Sal) FROM TableName
WHERE Sal IN
(SELECT TOP 4 Sal FROM TableName ORDER BY Sal DESC)

Si la Sal contiene valores duplicados, use esto

SELECT MIN(Sal) FROM TableName
WHERE Sal IN
(SELECT distinct TOP 4 Sal FROM TableName ORDER BY Sal DESC)

el 4 será el enésimo valor, puede ser cualquier valor más alto, como 5 o 6, etc.

0
user3844776
Select min(fee) 
from fl_FLFee 
where fee in (Select top 4 Fee from fl_FLFee order by 1 desc)

Cambiar el número cuatro con N.

0
user3110552
select sal,ename from emp e where
 2=(select count(distinct sal) from emp  where e.sal<=emp.sal) or
 3=(select count(distinct sal) from emp  where e.sal<=emp.sal) or
 4=(select count(distinct sal) from emp  where e.sal<=emp.sal) order by sal desc;
0
Ankush

En PostgreSQL, para encontrar el enésimo salario más grande de la tabla Empleado.

SELECT * FROM Employee WHERE salary in 
(SELECT salary FROM Employee ORDER BY salary DESC LIMIT N) 
ORDER BY salary ASC LIMIT 1;
0
Trung Lê Hoàng

consulta mysql: supongamos que quiero encontrar la enésima tabla de empleados del formulario de salario máximo

select salary 
form employee
order by salary desc
limit n-1,1 ;
0
mjp

Consulta SQL simple para obtener el detalle del empleado que tiene Nth MAX Salary en la tabla Employee.

sql> select * from Employee order by salary desc LIMIT 1 OFFSET <N - 1>;

Considere la estructura de la tabla como:

Empleado (id [int clave principal auto_increment], nombre [varchar (30)], salario [int]);

Ejemplo:

Si necesita el tercer salario de MAX en la tabla anterior, la consulta será:

sql> select * from Employee order by salary desc LIMIT 1 OFFSET 2;

Del mismo modo:

Si necesita el octavo salario de MAX en la tabla anterior, la consulta será:

sql> select * from Employee order by salary desc LIMIT 1 OFFSET 7;

NOTA: Cuando tiene que obtener el Enésimo MAX valor debe dar el OFFSET como (N - 1) .

De esta manera, puede realizar el mismo tipo de operación en caso de salario en orden ascendente.

0
Rahul Raina

En SQL Server, solo haga:

select distinct top n+1 column from table order by column desc

Y luego deseche el primer valor, si no lo necesita.

0
Blorgbeard

Otro para Oracle que utiliza funciones analíticas:

select distinct col1 --distinct is required to remove matching value of column
from 
( select col1, dense_rank() over (order by col1 desc) rnk
  from tbl
)
where rnk = :b1
0
Eugene Patek

para SQL 2005:

SELECT col1 from 
     (select col1, dense_rank(col1) over (order by col1 desc) ranking 
     from t1) subq where ranking between 2 and @n
0
JesseG

Respuesta: segundo superior:

select * from (select * from deletetable   where rownum <=2 order by rownum desc) where rownum <=1
0
parveen