2010-12-19 8 views

Odpowiedz

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 


Jeśli oczekujesz więcej niż jeden wiersz, aby mieć taką samą wartość w your_sort_column Można również użyć funkcji (rangi)

 
SELECT * 
FROM (
    SELECT some_column, 
     rank() over (order by your_sort_column desc) as row_rank 
    FROM some_table 
) t 
WHERE row_rank = 3 
migh Ten powrót więcej niż jeden wiersz ..

+1

+1: Tylko zastrzeżenie to funkcje analityczne są obsługiwane w 9i +. A DENSE_RANK może być lepszym wyborem niż RANK, w zależności od potrzeb. –

+0

Nieprawda. Funkcje analityczne były dostępne w 8i: http://download.oracle.com/docs/cd/A87860_01/doc/server.817/a85397/function.htm#81409. Ale 8i i 9i i tak są de-wspierane. Więc nie ma powodu, aby publikować odpowiedzi obejmujące te wersje, jeśli wyraźnie nie wspomniano –

0

Można ORDER BY column name a następnie LIMIT 1,1 dostać drugi

edycję

Ups, nie patrz tag Oracle, przepraszam.
ORDER BY column name WHERE ROWNUM = 2 powinna działać lepiej.

+1

Oracle nie obsługuje LIMIT. – Ronnis

+0

@Ronnis mówi, że masz rację, zaktualizowana odpowiedź – Agos

+2

"GDZIE ROWNUM = 2" nigdy nie zwróci żadnych wierszy. –

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

Wymień &N żądanym numerem. Na przykład 2 da ci drugie największe wynagrodzenie.

Jeśli używasz PL/SQL, po prostu wykonaj instrukcję. poprosi o N.

3

Myślę, że poniższe zapytanie będzie działało, aby znaleźć drugi najwyższy rekord z NOT IN.

SELECT MAX(userId) FROM tabela WHERE userId NOT IN (SELECT MAX (userId) FROM tabela)

proste i użyteczne ...

1

Aby uzyskać drugi największy stosowanie wynagrodzenia to:

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

działa idealnie, ale nadal nie rozumiem, dlaczego zapytanie nie działa po modyfikacji, jak poniżej ZMODYFIKOWANE: wybierz s2.salary, rownum rm z (wybierz odrębny pensja od pracowników zamówienia przez pensję desc) s2 gdzie rm <= 2 – Abilash

6

można znaleźć ntą największą wartość kolumny za pomocą następującego zapytania

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

Witamy w Stack Overflow! Dziękujemy za przesłanie odpowiedzi! Pamiętaj, aby uważnie przeczytać [FAQ na temat autopromocji] (http://stackoverflow.com/faq#promotion).Należy również pamiętać, że * wymagane * jest to, że publikujesz zrzeczenie się za każdym razem, gdy łączysz się z własną witryną/produktem. –

1

Działa na drugim najwyższego wynagrodzenia,

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

Spróbuj tego,

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

Zapytanie o MySql ... – gifpif

0

Spróbuj tego:

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

nice ans thanksssssssssssssssssssssssssssssssssssss – user2326989

+0

To nie zadziała z Oracle. –

0

Można spróbować tej sql gdzie ROW_NUMBER() funkcja Oracle SQL jest używany

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

Można użyć CONNECT BY PRIOR przez:

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; 

Zapytanie:

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:

drugie podejście jest użycie NTH_VALUE funkcja analityczna:

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

DBFiddle Demo3

Powiązane problemy