Używanie funkcji RANK, AGGREGATE i OFFSET
W operacjach okien można użyć funkcji agregujących, takich jak SUM, MIN i MAX, aby wykonywać operacje na zestawie wierszy zdefiniowanych przez klauzulę OVER i jej argumenty.
Funkcje okien można podzielić na kategorie:
- Funkcje agregujące. Na przykład SUM, AVG i COUNT, które działają w oknie i zwracają wartość skalarną.
- Funkcje klasyfikacji. Na przykład RANK, ROW_NUMBER i NTILE. Funkcje klasyfikacji wymagają kolejności sortowania i zwracają wartość klasyfikacji dla każdego wiersza w partycji.
- Funkcje analityczne. Na przykład CUME_DIST, PERCENTILE_CONT lub PERCENTILE_DISC. Funkcje analityczne obliczają rozkład wartości w partycji.
- Funkcje przesunięcia. Takie jak LAG, LEAD i LAST_VALUE. Funkcje przesunięcia zwracają wartości z innych wierszy względem położenia bieżącego wiersza.
Funkcje agregujące
Funkcje agregujące zwracają sumy, średnie lub liczby elementów. Funkcje agregujące wykonują obliczenia i zwracają pojedynczą wartość. Z wyjątkiem COUNT(*), funkcje agregujące nie zliczają wartości NULL.
Rozważ następujący kod, który stosuje niektóre typowe funkcje agregujące do cen produktów w tabeli products:
SELECT Name, ProductNumber, Color, SUM(Weight)
OVER(PARTITION BY Color) AS WeightByColor
FROM SalesLT.Product
ORDER BY ProductNumber;
Spowoduje to zwrócenie kolumny o nazwie WeightByColor, która zawiera całkowitą wagę dla wszystkich produktów o tym samym kolorze, co pokazano w poniższym zestawie wyników częściowych.
Funkcje klasyfikowania
Funkcje klasyfikacji przypisują liczbę do każdego wiersza, w zależności od jego pozycji w określonej kolejności. Kolejność jest określana przy użyciu klauzuli ORDER BY.
Rozważmy następujący kod, który stosuje wszystkie cztery funkcje klasyfikacji do produktów w tabeli products.
SELECT productid, name, listprice
,ROW_NUMBER() OVER (ORDER BY productid) AS "Row Number"
,RANK() OVER (ORDER BY listprice) AS PriceRank
,DENSE_RANK() OVER (ORDER BY listprice) AS "Dense Rank"
,NTILE(4) OVER (ORDER BY listprice) AS Quartile
FROM SalesLT.Product
Spowoduje to zwrócenie kolumny dla każdej funkcji z odpowiednim numerem klasyfikacji.
Funkcje analityczne
Funkcje analityczne obliczają wartość na podstawie grupy wierszy. Funkcje analityczne służą do obliczania średnich ruchomych, sum uruchomionych i wyników pierwszych N. Te funkcje obejmują:
- CUME_DIST
- FIRST_VALUE
- PERCENT_RANK
- PERCENTILE_CONT
- PERCENTIL_DISC
Funkcje OFFSET
Funkcje przesunięcia umożliwiają zwrócenie wartości kolejnych lub poprzednich wierszy w zestawie wyników.
Funkcje przesunięcia działają na pozycji, która jest względna względem bieżącego wiersza lub względem granicy początkowej lub końcowej ramy okna. Funkcje przesunięcia to:
- LAG i LEAD — działają na przesunięcie do bieżącego wiersza i wymagają klauzuli ORDER BY.
- FIRST_VALUE i LAST_VALUE - działają na przesunięcie od ramy okna. Poniżej przedstawiono składnię funkcji LAG. Funkcja LEAD działa w taki sam sposób.
LAG (scalar_expression [,offset] [,default])
OVER ( [ partition_by_clause ] order_by_clause )
W poniższym przykładzie kodu funkcja przesunięcia LEAD zwraca wartość budżetu następnego roku:
SELECT [Year], Budget, LEAD(Budget, 1, 0) OVER (ORDER BY [Year]) AS 'Next'
FROM dbo.Budget
ORDER BY [Year];
Poniżej przedstawiono składnię LAST_VALUE. FIRST_VALUE działa w ten sam sposób.
LAST_VALUE ( [ scalar_expression ] )
OVER ( [ partition_by_clause ] order_by_clause rows_range_clause )
Składnia jest podobna do LAG i LEAD z dodawaniem klauzuli wierszy/zakresu.