Przez lata używałem GROUP BY
wszystkich typów zapytań zagregowanych. Ostatnio przerobiłem inżynierię kodu, który używa PARTITION BY
do wykonywania agregacji. Czytając całą dokumentację, którą mogę znaleźć PARTITION BY
, brzmi to bardzo podobnie GROUP BY
, może z dodaną odrobiną dodatkowej funkcjonalności? Czy są to dwie wersje tej samej ogólnej funkcjonalności, czy też są czymś zupełnie innym?
źródło
Możemy wziąć prosty przykład.
Rozważ tabelę o
TableA
następujących wartościach:GROUP BY
Składnia:
Możemy złożyć
GROUP BY
w naszej tabeli:Wyniki:
W naszej prawdziwej tabeli mamy 7 wierszy, a kiedy stosujemy
GROUP BY id
, serwer grupuje wyniki na podstawieid
:W prostych słowach:
PARTITION BY
Zanim przejdziemy do PARTITION BY, spójrzmy na
OVER
klauzulę:Zgodnie z definicją MSDN:
PARTITION BY nie zmniejszy liczby zwracanych wierszy.
Możemy zastosować PARTITION BY w naszej przykładowej tabeli:
Wynik:
Spójrz na wyniki - podzieli wiersze i zwróci wszystkie wiersze, w przeciwieństwie do GROUP BY.
źródło
partition by
może wpływać na liczbę wierszy, to po prostu nie zmniejszy liczby wierszy.SELECT
naSELECT DISTINCT
drugie zapytanie? czy to nie zwróci tego samego zestawu danych coGROUP BY
zapytanie? Jakie są powody wyboru jednego lub drugiego?partition by
tak naprawdę nie zwija danych. Pozwala zresetować coś na podstawie grupy. Na przykład można uzyskać kolumnę porządkową w grupie, dzieląc ją na pole grupowania i używającrownum()
wierszy w tej grupie. To daje coś, co działa trochę jak kolumna tożsamości, która resetuje się na początku każdej grupy.źródło
Znajduje się pod tym linkiem: OVER Klauzula
źródło
Zapewnia zrolowane dane bez zwijania
tj. Załóżmy, że chcę zwrócić względną pozycję regionu sprzedaży
Za pomocą PARTITION BY mogę zwrócić kwotę sprzedaży dla danego regionu i kwotę MAX we wszystkich regionach sprzedaży w tym samym wierszu.
Oznacza to, że będziesz mieć powtarzające się dane, ale może to odpowiadać konsumentowi końcowemu w tym sensie, że dane zostały zagregowane, ale żadne dane nie zostały utracone - tak jak w przypadku GROUP BY.
źródło
PARTITION BY
jest analityczny, podczas gdyGROUP BY
jest agregowany. Aby go użyćPARTITION BY
, musisz go zawrzeć z klauzulą OVER .źródło
PARTITION BY is analytic
to proste stwierdzenie wiele mi wyjaśniło. +1.Z mojego punktu widzenia Partition By jest prawie identyczny jak Group By, ale z następującymi różnicami:
Ta grupa faktycznie grupuje zestaw wyników zwracając jeden wiersz na grupę, co powoduje, że SQL Server zezwala tylko na liście SELECT agregujące funkcje lub kolumny, które są częścią grupy według klauzuli (w takim przypadku SQL Server może zagwarantować, że są unikalne wyniki dla każdej grupy).
Rozważmy na przykład MySQL, który pozwala mieć kolumny listy SELECT, które nie są zdefiniowane w klauzuli Group By, w którym to przypadku jeden wiersz jest nadal zwracany na grupę, jednak jeśli kolumna nie ma unikalnych wyników, nie ma gwarancji jaki będzie wynik!
Ale dzięki Partition By, chociaż wyniki funkcji są identyczne z wynikami funkcji agregującej z Group By, nadal otrzymujesz normalny zestaw wyników, co oznacza, że otrzymujesz jeden wiersz na leżący poniżej wiersz, a nie jeden wiersz na wiersz grupa, z tego powodu można mieć kolumny, które nie są unikalne dla każdej grupy na liście WYBIERZ.
Podsumowując, Group By byłby najlepszy, gdy potrzebuje wyniku jednego wiersza na grupę, a Partition By byłby najlepszy, gdy trzeba wszystkich wierszy, ale nadal chce funkcji agregującej opartej na grupie.
Oczywiście mogą występować również problemy z wydajnością, patrz http://social.msdn.microsoft.com/Forums/ms-MY/transactsql/thread/0b20c2b5-1607-40bc-b7a7-0c60a2a55fba .
źródło
Gdy użyjesz
GROUP BY
, wynikowe wiersze będą zwykle mniejsze niż wiersze przychodzące.Ale gdy używasz
PARTITION BY
, wynikowa liczba wierszy powinna być taka sama jak przychodząca.źródło
Załóżmy, że mamy 14 rekordów
name
kolumny w tabeliw
group by
da licznik w jednym rzędzie, tj. 14
ale w
partition by
zwiększy się o 14 rzędów
źródło
Mała obserwacja. Mechanizm automatyzacji do dynamicznego generowania SQL za pomocą „podziału według” jest znacznie prostszy do wdrożenia w stosunku do „grupowania według”. W przypadku „grupuj według” musimy zadbać o treść kolumny „wybierz”.
Przepraszam za mój angielski.
źródło
Ma naprawdę różne scenariusze użytkowania. Podczas korzystania z GROUP BY scalasz niektóre rekordy dla kolumn, które są takie same i masz agregację zestawu wyników.
Jednak gdy używasz PARTITION BY, twój zestaw wyników jest taki sam, ale po prostu masz agregację funkcji okna i nie scalasz rekordów, nadal będziesz mieć taką samą liczbę rekordów.
Oto pomocny rajdowy artykuł wyjaśniający różnicę: http://alevryustemov.com/sql/sql-partition-by/
źródło
źródło