2011-07-27 41 views
7

Tôi đang viết truy vấn để tìm nạp bản ghi từ kho lưu trữ của Oracle. Một truy vấn chọn đơn giản của nó với sự tham gia trên vài bảng và tôi có vài cột được tổng hợp. Do đó tôi kết thúc bằng cách sử dụng Groupby trên phần còn lại của các cột.Nhóm theo Phân vùng theo trong Oracle

Giả sử tôi chọn khoảng 10 cột và trong số đó có 5 cột tổng hợp. vì vậy tôi cần nhóm theo 5 cột khác. Tôi thậm chí có thể đạt được như vậy bằng cách không làm một Groupby và sử dụng hơn (paritition by) khoản trên mỗi cột tổng hợp tôi muốn lấy được.

Tôi không chắc chắn điều nào tốt hơn đối với nhà kho hoặc nói chung.

Trả lời

18

Chúng không giống nhau.

này sẽ trở lại 3 hàng:

select deptno, count(*) c from emp group by deptno; 

DEPTNO C 
------ - 
10  3 
20  5 
30  6 

này sẽ trở lại 14:

select deptno, count(*) over (partition by deptno) c from emp; 


DEPTNO C 
------ - 
10  3 
10  3 
10  3 
20  5 
20  5 
20  5 
20  5 
20  5 
30  6 
30  6 
30  6 
30  6 
30  6 
30  6 
+2

Tôi đang cố gắng hiểu. Đúng nếu tôi đã sai lầm. vì vậy nếu tôi nhận được khác biệt của truy vấn thứ hai nó sẽ cho tôi kết quả truy vấn đầu tiên. Tôi đã sử dụng phân vùng chỉ để làm xếp hạng() trên mệnh đề nhất định dựa trên một cột phân vùng và có được thứ hạng đầu tiên hoặc hơn. Trong hoàn cảnh nào, kết quả truy vấn thứ hai sẽ hữu ích? cảm ơn bạn –

+3

Tôi sẽ nói rằng nếu nó có thể được thực hiện bằng cách sử dụng GROUP BY, đó là thích hợp hơn. Hàm phân tích nên được sử dụng cho các trường hợp bạn muốn các hàng riêng lẻ cộng với một số thông tin tổng hợp - như ví dụ xếp hạng(). –

+0

@Tony .. cảm ơn bạn .. đang có hình ảnh đẹp hơn ... –

5

Check this link Sự khác biệt chính giữa chức năng tổng hợp và phân tích là mặc dù chức năng phân tích cho kết quả tổng hợp họ không nhóm tập kết quả. Chúng trả về giá trị nhóm nhiều lần với mỗi bản ghi.

-1

Với PARTITON BY, bạn có thể thực hiện việc này trong một truy vấn để nhận các phép tính hoặc nhóm khác nhau theo.

select 
    DISTINCT deptno, count(*) over (partition by deptno) c, 
    COUNT(*) OVER (PARTITION BY NULL) AS TOTAL 
from emp;