この問題を解決する最善の方法は、Oracleのバージョンに一部依存します。これは、match_recognize
を使用した非常に単純な(そして、おそらく非常に効率的な)ソリューションです。 バージョン12.1で追加された句。
EMPLOYEES
を使用して説明します 標準のHR
のテーブル スキーマ、SALARY
による順序付け 。ここでの唯一のトリックは、上と下の5行を選択し、その間のすべてを無視することです。それ(「無視する」)は{- ... -}
演算子はpattern
で行います 副節。
select employee_id, first_name, last_name, salary
from hr.employees
match_recognize(
order by salary desc
all rows per match
pattern ( a{5} {- a* -} a{5} )
define a as 0 = 0 -- For reasons known only to Oracle, DEFINE is required.
);
EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY
----------- -------------------- ------------------------- ----------
100 Steven King 24000
101 Neena Kochhar 17000
102 Lex De Haan 17000
145 John Russell 14000
146 Karen Partners 13500
135 Ki Gee 2400
127 James Landry 2400
136 Hazel Philtanker 2200
128 Steven Markle 2200
132 TJ Olson 2100