2010-12-19 25 views

Respuesta

18
 
SELECT * 
FROM (
    SELECT some_column, 
     row_number() over (order by your_sort_column desc) as row_num 
    FROM some_table 
) t 
WHERE row_num = 3 


Si espera más de una fila para tener el mismo valor en your_sort_column también se puede utilizar la función de rango()

 
SELECT * 
FROM (
    SELECT some_column, 
     rank() over (order by your_sort_column desc) as row_rank 
    FROM some_table 
) t 
WHERE row_rank = 3 
Este migh volver más de una fila ..

+1

+1: La única advertencia es que las funciones analíticas son compatibles con 9i +. Y DENSE_RANK podría ser una mejor opción que RANK, según las necesidades. –

+0

No es cierto. Las funciones analíticas estaban disponibles en 8i: http://download.oracle.com/docs/cd/A87860_01/doc/server.817/a85397/function.htm#81409. Pero 8i y 9i son deshabilitados de todos modos. Así que no hay razón para publicar respuestas que cubren esas versiones, si no explícitamente mencionado –

0

Puede ORDER BY column nameLIMIT 1,1 y luego de obtener el segundo

edición

¡Vaya, no ver la etiqueta de Oracle, lo siento.
ORDER BY column name WHERE ROWNUM = 2 debería funcionar mejor.

+1

Oracle no admite LÍMITE. – Ronnis

+0

@Ronnis whooops tiene razón, la respuesta actualizada – Agos

+2

"WHERE ROWNUM = 2" nunca devolverá ninguna fila. –

0
SELECT DISTINCT (a.sal) FROM EMP A WHERE &N = (
    SELECT COUNT (DISTINCT (b.sal)) FROM EMP B WHERE a.sal<=b.sal 
); 

Reemplazar &N contigo número deseado. Por ejemplo, 2 le dará el segundo salario más grande.

Si está utilizando PL/SQL, simplemente ejecute la instrucción. Se le pedirá para N.

3

Creo que la siguiente consulta funcionará para encontrar el segundo registro más alto con NOT IN.

SELECT MAX(userId) FROM tabla WHERE userId NO IN (SELECT MAX (userId) de la tabla)

simple y útil ...

1

Para obtener la segunda mayor uso sueldo esto:

select salary from 
    (select s2.salary,rownum rm from 
    (select distinct salary from employees order by salary desc) 
    s2 where rownum<=2) 
where rm >= 2 
+0

funciona perfectamente, pero todavía no estoy entiendo por qué la consulta no está funcionando después de modificar, como a continuación MODIFICADO: seleccione s2.salary, rm rownum de (select distinct salario de los empleados ordenar por salario desc) s2 donde rm <= 2 – Abilash

6

se puede encontrar el enésimo valor más alto de la columna utilizando la siguiente consulta

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

¡Bienvenido a Stack Overflow! ¡Gracias por publicar tu respuesta! Asegúrese de leer detenidamente [Preguntas frecuentes sobre autopromoción] (http://stackoverflow.com/faq#promotion).También tenga en cuenta que * se requiere * que publique un descargo de responsabilidad cada vez que se vincula a su propio sitio/producto. –

1

Funciona con el segundo salario más alto,

$query = "SELECT * FROM `table_name` ORDER BY field_name` DESC LIMIT 1 , 1 "; 
0

Probar esto,

SELECT Sal FROM Tab ORDER BY Sal DESC LIMIT 2,1 
+0

Consulta para MySql ... – gifpif

0

Prueba esto:

SELECT DISTINCT TOP 3 id,[Password] 
FROM Users_changepassword 
WHERE [UserId] = 3 
ORDER BY id DESC 
+0

nice ans thanksssssssssssssssssssssssssssssssssssss – user2326989

+0

Esto no funcionará con Oracle. –

0

puede probar esta sql donde se utiliza la función ROW_NUMBER() del sql Oracle

select column_name from (
select column_name , 
row_number() over (order by column_name desc) as row_num 
from table_Name) tablex 
where row_num =3 
0
SELECT MAX(Salary) FROM Employee 
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee) 
0

Usted podría utilizar CONNECT BY PRIOR por:

CREATE TABLE t(i INT, sal INT); 
INSERT INTO t(i, sal) 
SELECT 1,100 FROM dual UNION 
SELECT 2,100 FROM dual UNION 
SELECT 3,200 FROM dual UNION 
SELECT 4,500 FROM dual UNION 
SELECT 5,1000 FROM dual; 

Consulta:

SELECT level, MAX(sal) AS sal 
FROM t 
--WHERE level = 2 -- set position here 
CONNECT BY prior sal > sal 
GROUP BY level 
ORDER BY level; 

DBFiddle Demo

DBFiddle Demo2


EDIT:

segundo enfoque es utilizar NTH_VALUE función analítica:

SELECT DISTINCT NTH_VALUE(sal, 2) OVER(ORDER BY sal DESC 
     ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) 
FROM t; 

DBFiddle Demo3

Cuestiones relacionadas