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
+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. –
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 –