2008-09-17 17 views

Respuesta

9

Se podría ordenar la columna en formato descendente y luego simplemente obtener el valor de la fila n.

EDITAR ::

Actualizado según la petición de comentario. ADVERTENCIA ¡completamente sin verificar!

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 tenga que obtener la sintaxis correctamente.

+0

¿Puede proporcionar un fragmento de código? Intenté su sugerencia, pero no pude obtener el valor de la enésima fila. –

+0

Usar 'ROWID' no es seguro ni práctico. Tomemos el caso de [tag: sqlite]. 'ROWID' puede o no generarse en serie.Además, el orden de 'ROWID' podría no coincidir con el de la columna solicitada. – Quirk

5

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

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

saltaría el primer 7, y luego se obtiene la siguiente diez más alto.

+0

Si está usando mysql, esto no funcionará en Oracle (o mssql creo) –

+0

buen punto, lo aclaró – Pieter

0

En SQL Server, simplemente:

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

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

3

De nuevo es posible que necesite para arreglar para su base de datos, pero si desea que el segundo valor superior en un conjunto de datos que potencialmente ha duplicado el valor, tendrá que hacer un grupo, así:

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

Saltaría los primeros dos, y luego te conseguirá los próximos cinco más altos.

4

Puro SQL (nota: recomendaría el uso de características SQL específicas para su DBMS, ya que es probable que sea más eficiente). Esto le dará el n + 1º valor más grande (para obtener el más pequeño, voltear el <). Si tiene duplicados, haga la cuenta (distinto valor) ..

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

Aquí es 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 quería el valor único de orden n, que sería un signo profundo en el bloque de consulta interna.

0

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

Otra para Oracle mediante 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

Sólo excavadas en esta pregunta en la búsqueda de la respuesta a mí mismo, y esto parece que funciona para SQL Server 2005 (derivado de Blorgbeard's solution):

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

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

22

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

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

La siguiente consulta arrojará 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 | 
+------+ 
+2

¡Una solución fácil de usar en todas las bases de datos! ¡Bien pensado! :) – Sterex

+0

¡Gran respuesta! Me he enfrentado a este problema antes y estaba preocupado acerca de cómo resolverlo sin ser específico de un proveedor :) Una posible desventaja es que hace una subconsulta para cada fila. – gaboroncancio

+0

¡Esto es asombroso! Lo estoy usando con el operador '> =' para obtener todas las filas con hasta la posición Nth. Me gustaría agregarle un ranking, como '1' para el valor máximo, '2' para el segundo máximo, etc. ¿Tiene alguna idea de cómo hacerlo? – NurShomik

0
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; 
1
Select max(sal) 
from table t1 
where N (select max(sal) 
     from table t2 
     where t2.sal > t1.sal) 

Para hallar el enésimo Sal máx.

1
SELECT * FROM tablename 
WHERE columnname<(select max(columnname) from tablename) 
order by columnname desc limit 1 
0

MySQL:

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

empleado Tabla

salary 
1256 
1256 
2563 
8546 
5645 

obtendrán el segundo valor máximo de esta consulta

select salary 
from employee 
where salary=(select max(salary) 
       from employee 
       where salary <(select max(salary) from employee)); 

obtendrán el tercer valor máximo por esta consulta

select salary 
from employee 
where salary=(select max(salary) 
       from employee 
       where salary <(select max(salary) 
           from employee 
           where salary <(select max(salary)from employee))); 
+0

Los selects más externos son extraños. Detenerse en el primer máximo (salario) habría funcionado. – RichardTheKiwi

+0

Esta solución es una locura. –

0

Respuesta: superior segundos:

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

Cuando no agrega algo nuevo, no responda preguntas de 4 años :) – fancyPants

3

(Tabla Name = Estudiantes, Nombre de 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 
+0

MS SQL Server [row_number] (https://msdn.microsoft.com/en-us/library/ms186734.aspx) – woodvi

0

(TableName = Estudiantes, ColumnName = Mark):

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

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

SELECT * FROM TableName a WHERE 
    n = (SELECT count(DISTINCT(b.ColumnName)) 
    FROM TableName b WHERE a.ColumnName <=b.ColumnName); 
0

creo que la consulta a continuación funcionará perfecto en SQL Oracle ... He probado yo mismo ..

información relacionada con esta consulta: esta consulta es el uso de dos tablas denominadas employee y department con columnas en el nombre del empleado: name (nombre del empleado), dept_id (común a los empleados y departamento), salary

y columnas en la tabla departamento: dept_id (comunes para la tabla de empleados, así), 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
Select min(fee) 
from fl_FLFee 
where fee in (Select top 4 Fee from fl_FLFee order by 1 desc) 

Número de cambio de cuatro con N.

0

Se puede simplificar como este

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

Si la Sal contiene valores duplicados luego utilizan esta

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

el 4 habrá valor enésimo fuere cualquier valor más alto como 5 o 6 etc.

1

Esta es la consulta para obtener el n-más alto de colomn put n = 0 para el segundo más alto y n = 1 para el tercero más alto y así sucesivamente ...

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

simple consulta SQL para obtener el detalle de la persona que tiene enésima MAX Salary en la tabla Employee.

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

Considere estructura de la tabla como:

Empleado ( ID [int primaria auto_increment] sin nombre [varchar (30)], salario [int]);

Ejemplo:

Si necesita tercera MAX salario en la tabla anterior, entonces, la consulta será:

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

mismo modo:

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

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

NOTA: Cuando usted tiene que conseguir el enésimo MAX valor debe darle la OFFSET como (N - 1).

Así se puede hacer el mismo tipo de operación en caso de salario en orden ascendente.

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

donde n = 1, 2, 3, .... valor max nth.

+0

upvoted para sugerir la sintaxis de coma límite. –

0

En PostgreSQL, para encontrar el N-é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; 
Cuestiones relacionadas