2011-07-27 14 views
7

Piszę zapytanie, aby pobrać rekordy z magazynu Oracle. Jest to proste Wybierz zapytanie z łączeń na kilku tabelach i mam kilka kolumn do agregacji. Dlatego też używam Groupby w pozostałych kolumnach.Grupa według partycji Partycja w Oracle

Powiedz, że wybieram około 10 kolumn, z których 5 to kolumny zbiorcze. więc muszę pogrupować według pozostałych 5 kolumn. Mogę nawet osiągnąć to samo, nie robiąc Groupby i używając klauzuli over (paritition by) na każdej kolumnie agregującej, którą chcę wyprowadzić.

Nie jestem pewien, który jest lepszy w porównaniu z magazynem lub ogólnie.

Odpowiedz

18

To nie to samo.

Zwróci 3 rzędy:

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

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

ten wróci 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

Próbuję zrozumieć. Popraw mnie, jeśli się mylę. więc jeśli odróżniam drugie zapytanie, otrzymam pierwszy wynik zapytania. Użyłem partycji tylko do rangi() nad pewną klauzulą ​​opartą na kolumnie partycji i otrzymam pierwszą pozycję. W jakim przypadku użyteczny będzie drugi wynik zapytania? dziękuję –

+3

Powiedziałbym, że jeśli można to zrobić przy użyciu GROUP BY, jest to lepsze. Funkcje analityczne powinny być używane w przypadkach, w których chcesz, aby poszczególne wiersze oraz niektóre informacje zbiorcze - jak na przykład rang(). –

+0

@ Tony ... dziękuję .. coraz lepsze zdjęcie ... –

5

Check this link Główną różnicą pomiędzy funkcji agregujących i analitycznych jest to, że choć funkcje analityczne dają wynik łączny nie robić pogrupuj zestaw wyników. Zwracają wartość grupy wiele razy z każdym rekordem.

-1

Dzięki PARTITON BY możliwe jest wykonanie tego w jednym zapytaniu w celu uzyskania różnych obliczeń lub grupowania według.

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