FUNKCJE ANALITYCZNE
CO TO SĄ FUNKCJE ANALITYCZNE??
Funkcje analityczne są analitycznym rozszerzeniem funkcji SQL.
FUNKCJE ANALITYCZNE DZILIMY NA:
- funkcje rankingu - wykorzystywane do wyznaczania rankingów, podziałów zbiorów wierszy na grupy (n-tki),
- funkcje okna - wyznaczają wartości agregatów dla zbiorów wierszy wyznaczanych przy użyciu definicji okna,
- funkcje raportujące - wyznaczają wartości agregatów dla zbiorów wierszy
w ramach tzw. partycji
- funkcje LAG/LEAD - znajdują wartości określonych atrybutów w wierszach sąsiednich,
- funkcje FIRST/LAST - znajdują początkową lub końcową wartość w uporządkowanym zbiorze,
- odwrotne funkcje procentyli - wyznaczają wartość występującą w określonym miejscu w uporządkowanym zbiorze,
- funkcje rankingu hipotetycznego - wyznaczają hipotetyczny ranking zadanych wartości w uporządkowanym zbiorze,
- funkcja WIDTH_BUCKET - dzieli uporządkowany zbiór na określoną liczbę przedziałów o zadanej szerokości,
- funkcje statystyczne - wyliczają zmiany poziomów i inne statystyki.
MIEJSCE FUNKCJI ANALITYCZNYCH I RÓŻNICE FUNKCJI ANALITYCZNYCH OD SQL
• Funkcje analityczne różnią się sposobem działania i użycia od funkcji SQL-owych,
• Funkcje analityczne określając wynik dla bieżącego wiersza korzystają z informacji znajdujących się w sąsiadujących wierszach,
• Uwzględniając przetwarzanie polecenia SQL, można powiedzieć, że wartości funkcji analitycznych są wyliczane po wszystkich składowych operacjach (połączeniach, selekcji wierszy, grupowaniu, selekcji grup itd.),
• W przypadku funkcji analitycznych po uzyskaniu wyniku wykonywana jest tylko operacja sortowania.
•Składnia funkcji analitycznych jest kolejna różnica pomiędzy funkcjami analitycznymi a SQL. Skladnia jest następująca
Ściśle określone miejsce wyznaczania wartości funkcji analitycznych ma swoje znaczące konsekwencje:
- nie mogą być używane w klauzulach WHERE, GROUP BY, HAVING
- wykorzystywane są tylko i wyłącznie w klauzuli SELECT lub ORDER BY
- działają tylko i wyłącznie na wierszach, grupach będących efektem finalnym zapytania
- wiersze lub grupy odrzucone za pomocą klauzul WHERE lub HAVING nie są uwzględniane przez funkcje analityczne
np. Jeśli odrzucimy w zapytaniu wszystkich zarabiających powyżej 1000 zł. to może okazać się, że w rankingu osób wg zarobków pierwsze miejsce zajmuje osoba z kwotą 900 zł.
PARTYCJE, OKNA, BIEŻĄCY WIERSZ
• Do sprawnego posługiwania się Funkcjami analitycznymi musimy mic znajomość odpowiedniej terminologii.
- Partycje - umożliwiają podział rezultatu zapytania na autonomiczne, niezależne zbiory, w ramach których funkcje analityczne będą mogły wyznaczać oddzielne rankingi, średnie itp.
- Okna - występują tylko w przypadku funkcji okna. Pozwalają na zdefiniowane ruchomego zakresu - określanego indywidualnie dla każdego wiersza - w ramach którego funkcja będzie wyznaczała swoją wartość.
- Bieżący wiersz - wiersz, dla którego w danym momencie wyznaczany jest wynik funkcji analitycznej. W szczególności stanowi on punkt odniesienia przy wyznaczaniu zakresu okna.
Funkcje rankingu
• Funkcje rankingu wyznaczają ranking wiersza porównując wartości w nim zawarte z wartościami wierszy znajdujących się w tej samej partycji.
• Partycje pozwalają na wyznaczenie wielu oddzielnych rankingów.
• Porządek wierszy w partycji jest podstawowym elementem definiującym ranking
• Przykłady funkcji rankingu:
- RANK, DENSE_RANK
- CUME_DIST
- PERCENT_RANK
- NTILE
- ROW_NUMBER
• Składnia:
Funkcja okna
Definicja okna:
• Okno może być jednego z dwóch typów od użytych słów kluczowych przy jego definicji
- ROWS - okno fizyczne - wyrażone w liczbie krotek. Musi być albo stałą albo wyrażeniem, którego wartością jest liczba całkowita dodatnia.
- RANGE - okno logiczne - wyrażone przy użyciu wartości o typie zgodnym z atrybutem porządkującym wiersze w partycji. Jeśli wyrażenie to jest liczbą lub datą, wówczas wartość może być liczbądodatnią.
Jeśli wyrażenie w klauzuli ORDER BY jest datą wówczas wartość może być zarówno liczbą dodatnią jak i interwałem czasu
• Zakres okna może być zdefiniowany za pomocą wyrażeń
- BETWEEN … AND … - pozwala na jawne zdefiniowanie zarówno początku jak i końca okna
- określenia tylko początku okna, koniec okna w takim przypadku będzie domyślny - bieżący wiersz.
• Słowa kluczowe wykorzystywane przy definiowaniu okna:
- UNBOUNDED PRECEDING - początkiem okna będzie pierwszy wiersz w partycji, używane tylko przy definiowaniu początku okna
- UNBOUNDED FOLLOWING - końcem okna będzie końcowy wiersz w partycji, używane tylko przy definiowaniu końca okna
- CURRENT ROW - bieżący wiersz lub wartość w zależności od typu okna
• Początek okna nigdy nie może być za końcem okna
• Dla każdego wiersza okno wyznaczane jest indywidualnie
• Pominięcie definicji okna jest równoznaczne z wyrażeniem:
Okno obejmujące 5 wierszy: bieżący i po 2 przed i po bieżącym wierszu
• Okno rozpoczynające się od bieżącego wiersza a kończące na końcu partycji
• Okno obejmujące dwa ubiegłe miesiące
• Okno obejmujące wiersze z wartościami atrybutu nie mniejszymi niż 100 i nie większymi niż 200 od wartości w bieżącym wierszu
PRZYKŁAD:
Przykłady funkcji okna
• Dla każdej transakcji przedstaw jej datę, kwotę na jaką opiewała oraz:
- saldo po wykonaniu operacji,
- średnią kwotę operacji z ostatniego roku,
- minimalną kwotę z 3 ostatnich operacji,
- ilość operacji wykonanych od 6 miesięcy wstecz do 6 miesięcy po transakcji.
Funkcje raportujące
• Funkcje raportujące podobnie jak funkcje okna pozwalają na wyznaczenie wartości funkcji agregujących w oparciu o zbiór wierszy uzyskanych w wyniku zapytania.
• W odróżnieniu od funkcji okna nie wprowadzają one definicji okna, ani porządku wierszy w partycji.
• Zakresem obejmowanym do wyznaczenia wyniku funkcji agregujących jest zawsze cała partycja
• Funkcje raportujące są bardzo podobne do tradycyjnych funkcji agregujących: MAX, MIN, AVG, SUM, COUNT, STDDEV, VARIANCE, RATIO_TO_REPORT. Funkcjami
raportującymi mogą również funkcje regresji liniowej.
• Dzięki funkcjom raportującym mamy z poziomu pojedynczych wierszy dostęp do agregatów wyznaczonych na grupie.
• Składnia:
PRZYKŁAD
• Dla każdej transakcji przedstaw jej kwotę, datę i kategorię,
oraz:
- średnią kwotę operacji wchodzących w skład tej samej kategorii
- udział kwoty transakcji do wszystkich transakcji z tej samej kategorii
Funkcje LAG/LEAD
• Bardzo ciekawymi funkcjami analitycznymi o wielu zastosowaniach są funkcje LAG i LEAD.
• Funkcje te mogą sięgać do wartości określonych atrybutów znajdujących się w sąsiednich wierszach w tej samej partycji
• Przykłady:
- Pokaż okresy w jakich występował określony stan konta
- Pokaż zysk z kolejnych lat oraz różnicę w stosunku do zysku z lat poprzednich
• Funkcje LAG i LEAD wymagają określenia kolejności wierszy w partycji
• Składnia:
PRZYKŁAD:
Funkcje FIRST/LAST
• Funkcje FIRST/LAST są odpowiednikami funkcji okna FIRST_VALUE i LAST_VALUE. Działają one jednakże na całej partycji i nie ma w nich definicji okna.
• Funkcje FIRST/LAST mogą działać w dwóch trybach
- jako funkcje agregujące - bez użycia klauzuli OVER - w tym
przypadku "partycją" jest grupa wierszy (GROUP BY)
- jako zwykłe funkcje raportujące - z wykorzystaniem klauzuli OVER
• Składnia:
PRZYKŁAD:
1.Dla każdego roku wyświetl kwotę oraz datę największego przychodu (funkcja FIRST jako funkcja agregująca).
2.Dla każdej transakcji wyświetl różnicę kwoty transakcji i kwoty pierwszej transakcji wykonanej tego samego roku.
Funkcje PERCENTILE_DISC i PERCENTILE_CONT
• Funkcja CUME_DIST może służyć do wyznaczenia tzw. procentyli czyli określenia na jakim miejscu w uporządkowanym zbiorze, wyrażonym procentowo, znajduje się określona wartość
• Funkcje PERCENTILE_DISC i PERCENTILE_CONT służą do operacji odwrotnej. Informują jaka wartość znajduje się na określonej pozycji w uporządkowanym zbiorze wartości.
• PERCENTILE_DISC wyznaczane jest przez przeglądanie wyników uzyskanych w wyniku
funkcji CUME_DIST. Pierwszy wiersz, w którym wynik funkcji CUME_DIST jest większy od argumentu funkcji
PERCENTILE_DISC wyznacza poszukiwaną wartość.
• Wynik funkcji PERCENTILE_CONT jest wyznaczany przez liniową interpolację wierszy otaczających wskazaną pozycję. Algorytm do wyznaczenia wartości PERCENTILE_CONT(x) jest następujący:
- RN = (1+x*(n-1)) gdzie n jest liczbą wierszy w grupie
- CRN = CEIL(RN); FRN = FLOOR(RN)
- Jeśli CRN = FRN wówczas wynikiem jest wartość znajdująca się w wierszu RN w przeciwnym przypadku wynikiem jest wartość wyrażenia (CRN-RN)*(wartość z wiersza CRN)+(RN-FRN)*(wartość z wiersza FRN)
• Funkcje mają dwie postacie: funkcji agregujących i raportujących
• Składnia:
PRZYKŁAD:
Funkcje rankingu hipotetycznego
• Funkcje rankingu mają swoje odpowiedniki wyznaczające hipotetycznyranking zadanych wartości
• Mogą być wykorzystywane do badania sytuacji "co by było gdyby"
• Do funkcji rankingu hipotetycznego zaliczamy RANK, DENSE_RANK,
PERCENT_RANK i CUME_DIST. Argumentem tych funkcji jest wartość dla której poszukujemy wyniku rankingu
• Funkcje rankingu hipotetycznego są funkcjami agregującymi i działają na zbiorze wierszy znajdujących się w grupie
• Liczba i typy argumentów funkcji rankingu hipotetycznego muszą odpowiadać konstrukcji klauzuli ORDER BY
• Składnia:
PRZYKŁAD:
- na jakim miejscu znajdowałby klient z rocznym przychodem 3000 zł
- na jaki miejscu, wyrażonym procentowo, w przychodzie z roku 1999 określonego klienta znalazłaby się wpłata 1000 zł.
Funkcja WIDTH_BUCKET
• Interesującą funkcją zaliczaną do funkcji analitycznych jestfunkcja WIDTH_BUCKET. Pozwala ona na zdefiniowanie zakresu i szerokości przedziałów oraz wyznaczanie numerów
przedziałów, w których mieszczą się określone wartości w poszczególnych wierszach.
• W przeciwieństwie do funkcji NTILE która dzieli grupę wierszy na równoliczne przedziały, funkcja WIDTH_BUCKET dzieli grupę wierszy na przedziały o równej szerokości
• Składnia:
PRZYKŁAD:
- Wyznacz wyniki egzaminu zakładając, że maksymalna liczba punktów to 100 a liczba punktów potrzebnych do zaliczenia to 50.
- Na podstawie sumy posiadanych aktywów pogrupuj klientów na dwie kategorie "bogatych" i "biednych" zakładając, że minimalny analizowany próg to 5000, maksymalny to 10000 a podział ma być pośrodku.