Làm thế nào để bạn viết truy vấn trong đó chỉ một số hàng được lựa chọn được trả về với giá trị cột cao nhất hoặc thấp nhất.Oracle SQL - Cách lấy 5 giá trị cao nhất của một cột
tức là Báo cáo có 5 nhân viên được trả lương cao nhất?
Làm thế nào để bạn viết truy vấn trong đó chỉ một số hàng được lựa chọn được trả về với giá trị cột cao nhất hoặc thấp nhất.Oracle SQL - Cách lấy 5 giá trị cao nhất của một cột
tức là Báo cáo có 5 nhân viên được trả lương cao nhất?
Hãy thử điều này một:
SELECT * FROM
(SELECT field1, field2 FROM fields order by field1 desc)
where rownum <= 5
Ngoài ra hãy xem trên this resource cho một mô tả chi tiết về công trình như thế nào rownum.
Cách tốt nhất để làm điều này là với chức năng phân tích, RANK() hoặc DENSE_RANK() ...
SQL> select * from (
2 select empno
3 , sal
4 , rank() over (order by sal desc) as rnk
5 from emp)
6 where rnk <= 5
7/
EMPNO SAL RNK
---------- ---------- ----------
7839 5000 1
7788 3000 2
7902 3000 2
7566 2975 4
8083 2850 5
7698 2850 5
6 rows selected.
SQL>
DENSE_RANK() nén các khoảng trống khi có một tie:
SQL> select * from (
2 select empno
3 , sal
4 , dense_rank() over (order by sal desc) as rnk
5 from emp)
6 where rnk <= 5
7/
EMPNO SAL RNK
---------- ---------- ----------
7839 5000 1
7788 3000 2
7902 3000 2
7566 2975 3
8083 2850 4
7698 2850 4
8070 2500 5
7 rows selected.
SQL>
Hành vi nào bạn thích phụ thuộc vào yêu cầu kinh doanh của bạn.
Ngoài ra còn có hàm phân tích ROW_NUMBER() mà chúng tôi có thể sử dụng để trả lại một số hàng chính xác. Tuy nhiên, chúng ta nên tránh sử dụng các giải pháp dựa trên số hàng trừ khi logic nghiệp vụ vui lòng tự ý cắt bớt tập kết quả trong trường hợp có sự ràng buộc. Có sự khác biệt giữa yêu cầu những năm giá trị cao nhất và lăm hồ sơ đầu tiên sắp xếp theo giá trị cao
Ngoài ra còn có một giải pháp không phân tích bằng cách sử dụng ROWNUM pseudo-cột. Điều này là clunky vì ROWNUM được áp dụng trước mệnh đề ORDER BY, điều này có thể dẫn đến kết quả không mong muốn. Có rất ít lý do để sử dụng ROWNUM thay vì ROW_NUMBER() hoặc một trong các hàm xếp hạng.
Oracle 9i + cung cấp chức năng phân tích:
Tất cả các yêu cầu sử dụng của OVER
khoản, cho phép PARTITION BY
và ORDER BY
khoản đúng điều chỉnh ROW_NUMBER
/RANK
/Giá trịđược trả lại.
Trước 9i, tùy chọn duy nhất là làm việc với ROWNUM
- tình cờ nhanh hơn sử dụng ROW_NUMBER
(link).
Trong Oracle 12c, điều này có thể đạt được bằng FETCH..FIRST
ROWS..ONLY
Để lấy 5 lương cao nhất hàng đầu.
SELECT *
FROM EMPLOYEES
ORDER BY SALARY DESC
FETCH FIRST 5 ROWS ONLY;
Bạn có thể sử dụng 'QUALIFY ... <= 5' thay vì gói nó trong một lựa chọn khác. – lins314159
@ lins314159 - QUALIFY không phải là một cấu trúc mà Oracle hỗ trợ. – APC
Tôi nghĩ nó đã làm. Hoặc là liên kết nói về một số sản phẩm khác của Oracle? 'Http: //download.oracle.com/docs/cd/E12032_01/doc/epm.921/html_ir_studio/ir_studio-15-36.html' – lins314159