2009-07-07 4 views
54

Ý nghĩa của mệnh đề OVER trong Oracle là gì?Điều khoản OVER trong Oracle

+0

Nếu nghi ngờ, đọc hướng dẫn: http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions004.htm#SQLRF06174 –

Trả lời

60

Mệnh đề OVER chỉ định phân vùng, đặt hàng & cửa sổ "trên đó" chức năng phân tích hoạt động.

Ví dụ, điều này tính toán trung bình:

AVG(amt) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) 

date amt avg_amt 
===== ==== ======= 
1-Jan 10.0 10.5 
2-Jan 11.0 17.0 
3-Jan 30.0 17.0 
4-Jan 10.0 18.0 
5-Jan 14.0 12.0 

Nó hoạt động trên một cửa sổ di chuyển (3 hàng rộng) qua các hàng, sắp xếp theo ngày.

này tính toán số dư hoạt động:

SUM(amt) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 

date amt sum_amt 
===== ==== ======= 
1-Jan 10.0 10.0 
2-Jan 11.0 21.0 
3-Jan 30.0 51.0 
4-Jan 10.0 61.0 
5-Jan 14.0 75.0 

Nó hoạt động trên một cửa sổ bao gồm hàng hiện tại và tất cả các hàng trước.

này tính toán tối đa, riêng cho từng "nợ":

MAX(amt) OVER (PARTITION BY dept) 

dept amt max_amt 
==== ==== ======= 
ACCT 5.0 7.0 
ACCT 7.0 7.0 
ACCT 6.0 7.0 
MRKT 10.0 11.0 
MRKT 11.0 11.0 
SLES 2.0 2.0 

Nó hoạt động trên một cửa sổ bao gồm tất cả các hàng cho một nợ cụ thể.

SQL Fiddle: http://sqlfiddle.com/#!4/9eecb7d/122

+0

Bạn có thể giải thích cách OVER() hoạt động khi được sử dụng mà không có đối số? – Lamy

+3

Không có đối số có nghĩa là nó nằm trong toàn bộ tập kết quả. –

+0

Tại sao trong ví dụ đầu tiên của bạn có tính toán trước đó từ hàng đầu tiên bằng không? Đó có phải là thứ bạn có thể thay đổi không? – k9b

24

Bạn có thể sử dụng nó để chuyển đổi một số chức năng tổng hợp thành tích:

SELECT MAX(date) 
FROM mytable 

sẽ trở lại 1 hàng với tối đa duy nhất,

SELECT MAX(date) OVER (ORDER BY id) 
FROM mytable 

sẽ trả lại toàn bộ hàng với mức tối đa chạy.

+2

Bạn làm rất tốt điểm về việc chuyển đổi các hàm tổng hợp thành các hàm phân tích. Đó là một cách tôi chưa bao giờ nghĩ về nó. – user128216