Cách tốt nhất để giải quyết vấn đề này một phần phụ thuộc vào phiên bản Oracle của bạn. Đây là một giải pháp rất đơn giản (và tôi nghi ngờ là rất hiệu quả) bằng cách sử dụng match_recognize
, được bổ sung trong phiên bản 12.1.
Tôi minh họa nó bằng cách sử dụng EMPLOYEES
trong HR
tiêu chuẩn giản đồ, sắp xếp theo SALARY
. Mẹo duy nhất ở đây là chọn năm hàng trên cùng và dưới cùng, và bỏ qua mọi thứ ở giữa; đó ("bỏ qua") là {- ... -}
toán tử thực hiện trong pattern
mục con.
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