2010-02-21 40 views

Trả lời

10

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.

24

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ấtlă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.

+0

Bạn có thể sử dụng 'QUALIFY ... <= 5' thay vì gói nó trong một lựa chọn khác. – lins314159

+0

@ lins314159 - QUALIFY không phải là một cấu trúc mà Oracle hỗ trợ. – APC

+0

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

4

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 BYORDER 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).

+0

Cảm ơn. Mệnh đề OVER là mới đối với tôi. +1 – road242

+0

Trên thực tế Oracle đã giới thiệu các chức năng phân tích trong 8i, nhưng chỉ theo giấy phép Phiên bản doanh nghiệp. Trong 9i, họ đã được cấp phép theo Standard Edition. – APC

0

Trong Oracle 12c, điều này có thể đạt được bằng FETCH..FIRSTROWS..ONLY

Để lấy 5 lương cao nhất hàng đầu.

SELECT * 
     FROM EMPLOYEES 
    ORDER BY SALARY DESC 
FETCH FIRST 5 ROWS ONLY; 
Các vấn đề liên quan