Możemy wziąć prosty przykład.
Rozważ tabelę o TableA
następujących wartościach:
id firstname lastname Mark
-------------------------------------------------------------------
1 arun prasanth 40
2 ann antony 45
3 sruthy abc 41
6 new abc 47
1 arun prasanth 45
1 arun prasanth 49
2 ann antony 49
GROUP BY
Klauzula SQL GROUP BY może być używana w instrukcji SELECT do gromadzenia danych w wielu rekordach i grupowania wyników według jednej lub więcej kolumn.
Mówiąc prościej, instrukcja GROUP BY jest używana w połączeniu z funkcjami agregującymi do grupowania zestawu wyników według jednej lub więcej kolumn.
Składnia:
SELECT expression1, expression2, ... expression_n,
aggregate_function (aggregate_expression)
FROM tables
WHERE conditions
GROUP BY expression1, expression2, ... expression_n;
Możemy złożyć GROUP BY
w naszej tabeli:
select SUM(Mark)marksum,firstname from TableA
group by id,firstName
Wyniki:
marksum firstname
----------------
94 ann
134 arun
47 new
41 sruthy
W naszej prawdziwej tabeli mamy 7 wierszy, a kiedy stosujemy GROUP BY id
, serwer grupuje wyniki na podstawie id
:
W prostych słowach:
tutaj GROUP BY
zwykle zmniejsza liczbę zwracanych wierszy, zwijając je i obliczając Sum()
dla każdego wiersza.
PARTITION BY
Zanim przejdziemy do PARTITION BY, spójrzmy na OVER
klauzulę:
Zgodnie z definicją MSDN:
Klauzula OVER definiuje okno lub określony przez użytkownika zestaw wierszy w zestawie wyników zapytania. Funkcja okna oblicza następnie wartość dla każdego wiersza w oknie. Możesz użyć klauzuli OVER z funkcjami do obliczania wartości zagregowanych, takich jak średnie ruchome, skumulowane agregaty, sumy bieżące lub wyniki N na górze grupy.
PARTITION BY nie zmniejszy liczby zwracanych wierszy.
Możemy zastosować PARTITION BY w naszej przykładowej tabeli:
SELECT SUM(Mark) OVER (PARTITION BY id) AS marksum, firstname FROM TableA
Wynik:
marksum firstname
-------------------
134 arun
134 arun
134 arun
94 ann
94 ann
41 sruthy
47 new
Spójrz na wyniki - podzieli wiersze i zwróci wszystkie wiersze, w przeciwieństwie do GROUP BY.