Funkcje analityczne języka SQL



Podobne dokumenty
SQL do zaawansowanych analiz danych część 2.

188 Funkcje analityczne

1. Obliczenie SDR pojazdów silnikowych ogółem w punkcie pomiarowym typu P

Projektowanie Systemów Inf.

KASA EDUKACYJNA INSTRUKCJA. WARIANT I - dla dzieci młodszych

Język SQL : przyjazny podręcznik / Larry Rockoff. Wyd. 2. Gliwice, cop Spis treści

Opis modułu analitycznego do śledzenia rotacji towaru oraz planowania dostaw dla programu WF-Mag dla Windows.

Ćwiczenie nr 2 Zbiory rozmyte logika rozmyta Rozmywanie, wnioskowanie, baza reguł, wyostrzanie

STA T T A YSTYKA Korelacja

Uniwersytet Warszawski Teoria gier dr Olga Kiuila LEKCJA 5

Rozdział 14 Funkcje analityczne

KONKURSY MATEMATYCZNE. Treść zadań

Ćwiczenie 3. Funkcje analityczne

Temat: Funkcje. Własności ogólne. A n n a R a j f u r a, M a t e m a t y k a s e m e s t r 1, W S Z i M w S o c h a c z e w i e 1

MATEMATYKA 9. INSTYTUT MEDICUS Kurs przygotowawczy do matury i rekrutacji na studia medyczne Rok 2017/2018 FUNKCJE WYKŁADNICZE, LOGARYTMY

III. GOSPODARSTWA DOMOWE, RODZINY I GOSPODARSTWA ZBIOROWE

Uchwała nr 21 /2015 Walnego Zebrania Członków z dnia w sprawie przyjęcia Regulaminu Pracy Zarządu.

JTW SP. Z OO. Zapytanie ofertowe. Zakup i dostosowanie licencji systemu B2B część 1

Hurtownie danych - przegląd technologii

ORACLE. System Zarządzania Bazą Danych Oracle. Oracle Advanced SQL

Regulamin w konkurencjach solowych

ROZWIĄZANIA ZADAŃ Zestaw P3 Odpowiedzi do zadań zamkniętych

Stowarzyszenie Lokalna Grupa Działania EUROGALICJA Regulamin Rady

Regulamin Pracy Komisji Rekrutacyjnej w Publicznym Przedszkolu Nr 5 w Kozienicach

Zagadnienia transportowe

(Tekst ujednolicony zawierający zmiany wynikające z uchwały Rady Nadzorczej nr 58/2011 z dnia r.)

Logika I. Wykład 2. Działania na zbiorach

Funkcje analityczne SQL CUBE (1)

Charakterystyka systemów plików

Wtedy wystarczy wybrać właściwego Taga z listy.

Warszawska Giełda Towarowa S.A.

np. tu - na pierwszej formatce kreatora zaznaczamy opcję nr 3

Pacjenci w SPZZOD w latach

Wyniki badań dla trasy kolejowej Warszawa - Poznań.

Podatek przemysłowy (lokalny podatek od działalności usługowowytwórczej) :02:07

Harmonogramowanie projektów Zarządzanie czasem

Statystyki opisowe. Marcin Zajenkowski. Marcin Zajenkowski () Statystyki opisowe 1 / 57

Bazy danych. Andrzej Łachwa, UJ, /15

14.Rozwiązywanie zadań tekstowych wykorzystujących równania i nierówności kwadratowe.

Program szkoleniowy Efektywni50+ Moduł III Standardy wymiany danych

Zapytanie ofertowe dotyczy zamówienia publicznego o wartości nieprzekraczającej euro.

Praca na wielu bazach danych część 2. (Wersja 8.1)

Kalkulacyjny układ kosztów

API transakcyjne BitMarket.pl

Zapisy na kursy B i C

LOGISTYKA DYSTRYBUCJI ćwiczenia 5 ZAPASY ROZPROSZONE ZARZĄDZANIE ZAPASAMI WIELU LOKALIZACJI

Instalacja. Zawartość. Wyszukiwarka. Instalacja Konfiguracja Uruchomienie i praca z raportem Metody wyszukiwania...

TURYSTYKA W WOJEWÓDZTWIE ŚWIĘTOKRZYSKIM W 2007 ROKU

OGÓLNODOSTĘPNE IFORMACJE O WYNIKACH EGZAMINÓW I EFEKTYWNOŚCI NAUCZANIA W GIMNAZJACH przykłady ich wykorzystania i interpretowania

Algorytmy graficzne. Podstawy kompresji danych fragment wykładu. Marcin Wilczewski

Jak usprawnić procesy controllingowe w Firmie? Jak nadać im szerszy kontekst? Nowe zastosowania naszych rozwiązań na przykładach.

REGULAMIN SAMORZĄDU UCZNIOWSKIEGO GIMNAZJUM W ZABOROWIE UL. STOŁECZNA 182

RAPORT z diagnozy Matematyka na starcie

Załącznik nr 2 Testy logiczne służące sprawdzeniu jakości danych uczestników projektów współfinansowanych z EFS

2) Drugim Roku Programu rozumie się przez to okres od 1 stycznia 2017 roku do 31 grudnia 2017 roku.

CitiDirect EB - Mobile

PRZETWORNIK NAPIĘCIE - CZĘSTOTLIWOŚĆ W UKŁADZIE ILORAZOWYM

Wypełniają je wszystkie jednostki samorządu terytorialnego, tj. gminy, powiaty, województwa, miasta na prawach powiatu oraz związki komunalne.

Zakład Ubezpieczeń Społecznych Departament Statystyki i Prognoz Aktuarialnych

Opis programu do wizualizacji algorytmów z zakresu arytmetyki komputerowej

Spis treści. Spis treści 3

PODSTAWY METROLOGII ĆWICZENIE 4 PRZETWORNIKI AC/CA Międzywydziałowa Szkoła Inżynierii Biomedycznej 2009/2010 SEMESTR 3

4.3. Warunki życia Katarzyna Gorczyca

zarządzam, co następuje:

Wartość brutto Miesięczna rata leasingowa Cena brutto. Podatek VAT

Regulamin reklamy produktów leczniczych na terenie Samodzielnego Publicznego Zakładu Opieki Zdrowotnej Ministerstwa Spraw Wewnętrznych w Białymstoku

Zapytanie ofertowe dotyczące wyboru wykonawcy (biegłego rewidenta) usługi polegającej na przeprowadzeniu kompleksowego badania sprawozdań finansowych

WYRAŻENIA REGULARNE I JĘZYK AWK

Zarządzanie projektami. wykład 1 dr inż. Agata Klaus-Rosińska

ZASOBY MIESZKANIOWE W WOJEWÓDZTWIE MAZOWIECKIM W 2013 R.

3S TeleCloud - Aplikacje Instrukcja użytkowania usługi 3S KONTAKTY

oraz nowego średniego samochodu ratowniczo-gaśniczego ze sprzętem ratowniczogaśniczym

Kalkulator Kalorii by CTI. Instrukcja

Zintegrowane Systemy Zarządzania Biblioteką SOWA1 i SOWA2 SKONTRUM

Oferty portalu. Statystyki wejść w oferty wózków widłowych na tle ofert portalu w latach oraz I kw.2015 r I kw.

SIECI KOMPUTEROWE I BAZY DANYCH

I. LOGICZNE STRUKTURY DRZEWIASTE

Załącznik do zarządzenia Rektora Krakowskiej Akademii im. Andrzeja Frycza Modrzewskiego Nr 8/2013 z 4 marca 2013 r.

Powiatowy Urząd Pracy w Trzebnicy. w powiecie trzebnickim w 2008 roku Absolwenci w powiecie trzebnickim

Tematyka i rozwiązania metodyczne kolejnych zajęć lekcyjnych wraz z ćwiczeniami.

PROJEKTY UCHWAŁ NA NADZWYCZAJNE WALNE ZGROMADZENIE HETAN TECHNOLOGIES SPÓŁKA AKCYJNA W DNIU 25 MAJA 2016 ROKU

DZIENNIK USTAW RZECZYPOSPOLITEJ POLSKIEJ

Użytkowanie elektronicznego dziennika UONET PLUS.

Zadanie 3 - (7 punktów) Iloczyn składników Jeśli zapis liczby 22 w postaci sumy zawiera składnik 1, lepiej pogrupować go z innym składnikiem

Sytuacja na rynku kredytowym

Adres strony internetowej, na której Zamawiający udostępnia Specyfikację Istotnych Warunków Zamówienia:

Matematyka:Matematyka I - ćwiczenia/granice funkcji

Nowe funkcjonalności

UCHWAŁY PODJĘTE na Nadzwyczajnym Walnym Zgromadzeniu Akcjonariuszy w dniu 30 marca 2009 r. Uchwała nr 1

Geometria Wykreślna Wykład 3

NOWELIZACJA USTAWY PRAWO O STOWARZYSZENIACH

PK Panie i Panowie Dyrektorzy Izb Skarbowych Dyrektorzy Urzędów Kontroli Skarbowej wszyscy

Rozdział 6. Pakowanie plecaka. 6.1 Postawienie problemu

Bazy danych II. Andrzej Grzybowski. Instytut Fizyki, Uniwersytet Śląski

Regulamin rekrutacji. do II Liceum Ogólnokształcącego w Jaśle im. ppłk J.Modrzejewskiego. na rok szkolny 2014/2015

Nasz kochany drogi BIK Nasz kochany drogi BIK

W. Guzicki Zadanie 23 z Informatora Maturalnego poziom rozszerzony 1

Wynagrodzenia i świadczenia pozapłacowe specjalistów

Szczegółowe zasady obliczania wysokości. i pobierania opłat giełdowych. (tekst jednolity)

Przykłady wybranych fragmentów prac egzaminacyjnych z komentarzami Technik ochrony fizycznej osób i mienia 515[01]

Transkrypt:

Plan wykładu Funkcje analityczne języka SQL 1. Podstawowe definicje 2. Podział funkcji analitycznych 3. Omówienie kolejnych grup funkcji Hurtownie danych, wykład Bartosz Bębel E-mail: bartosz.bebel@cs.put.poznan.pl 2 Schemat wykorzystywany w przykładach Podstawowe definicje (1) Bieżący rekord: rekord, dla którego wyliczana jest wartość funkcji analitycznej Partycja: grupa rekordów, przetwarzanych przez zapytanie możliwości: jedna partycja, zawierająca wszystkie rekordy zapytania kilka dużych partycji, każda z dużą ilością rekordów wiele małych partycji, każda z niedużą ilością rekordów kryterium podziału: na podstawie wartości jednej lub wielu kolumn na podstawie jednego lub wielu wyrażeń 3 4

Podstawowe definicje (2) Etapy wykonania polecenia SQL Okno: 1. Połączenia, klauzule WHERE, GROUP BY, HAVING definiowane dla bieżącego rekordu partycji określa, ile rekordów przed (początek okna) i ile za (koniec okna) bieżącym jest brane pod uwagę przy obliczeniach możliwości: wszystkie rekordy partycji należą do jednego okna okno przesuwa się wraz ze zmianą bieżącego rekordu definicja rozmiaru okna: liczba rekordów wyrażenie definiujące przedział (np. czas) 2. Podział zbioru rekordów na partycje 3. Zastosowanie funkcji analitycznej dla każdego rekordu partycji 4. Wykonanie klauzuli ORDER BY 5 6 Podział funkcji analitycznych Ogólna składnia funkcji Funkcje rankingowe Funkcje rankingu hipotetycznego Funkcje okna Funkcje raportujące Funkcje LAG/LEAD Funkcje FIRST/LAST nazwa_funkcji([<lista parametrów funkcji>) OVER ([<definicja partycji>] <porządek sortowania w partycji> [<definicja okna>]) Elementy: definicja partycji określa podział zbioru rekordów na partycje, element opcjonalny porządek sortowania rekordów w partycji element obowiązkowy definicja okna tylko dla funkcji okna 7 8

Partycjonowanie rekordów Określa podział zbioru rekordów zapytania na oddzielne grupy, nazywane partycjami Uwaga! Nie mylić z partycjonowaniem relacji! PARTITION BY <wyrażenie> Przykłady: PARTITION BY miesiąc PARTITION BY kategoria, nazwa_produktu Funkcje rankingowe Wyliczają wartości na podstawie pozycji bieżącego rekordu w rankingu rekordów w partycji Funkcje: RANK i DENSE_RANK ranking CUME_DIST ranking względny PERCENT_RANK ranking procentowy ROW_NUMBER numer rekordu NTILE podział partycji na grupy PARTITION BY extract(year from czas_id) 9 10 RANK i DENSE_RANK (1) RANK i DENSE_RANK (2) Wyliczają pozycję wartości z bieżącego rekordu partycji w rankingu dla partycji Przykłady analiz: Znajdź pięć najlepiej sprzedających się produktów w ostatnim kwartale Podaj nazwiska trzech przedstawicieli handlowych z najgorszymi wynikami sprzedaży Różnice między RANK a DENSE_RANK: DOSTAWCA SUMA RANK DENSE_RANK ---------- ---------- ---------- ---------- D-Dell 3060392,88 1 1 BCF 187114,20 2 2 Tefal 181009,08 3 3 Touch Inc 64374,24 4 4 Agfa 55000,00 5 5 CD Inc 55000,00 5 5 Mop Inc 55000,00 5 5 Ricoh 9630,36 8 6 RANK() DENSE_RANK() OVER ([<definicja partycji>] <porządek sortowania> [NULLS FIRST NULLS LAST]) definicja partycji: wiele partycji jeden ranking dla każdej partycji, brak partycjonowania jeden ranking na całym zbiorze rekordów zapytania porządek sortowania definiuje kryterium ustawiające ranking, NULLS FIRST, NULLS LAST wskazuje sposób umieszczenia w rankingu pozycji pustych: Typ NULLS FIRST NULLS LAST ranking rosnący (ASC) na początku na końcu ranking malejący (DESC) na początku rankingu na końcu rankingu 11 12

RANK i DENSE_RANK (3) Przykład 1. (bez partycjonowania, ranking malejący): Zbuduj ranking dostawców ze względu na sumę cen sprzedaży produktów przez nich dostarczanych SELECT dostawca, SUM(cena_sprzedazy) AS suma, RANK() OVER (ORDER BY SUM(cena_sprzedazy) DESC) AS ranking GROUP BY dostawca; DOSTAWCA SUMA RANKING ---------- ---------- ---------- D-Dell 3060392,88 1 BCF 187114,20 2 Tefal 181009,08 3 Touch Inc 64374,24 4 Agfa 57276,44 5 CD Inc 40365,92 6 Mop Inc 37577,64 7 Ricoh 9630,36 8 RANK i DENSE_RANK (4) Przykład 2. (partycjonowanie, ranking malejący): Zbuduj ranking dostawców ze względu na sumę cen sprzedaży produktów przez nich dostarczanych, z podziałem na kolejne miesiące 1999 roku SELECT dostawca, miesiac, SUM(cena_sprzedazy) AS suma, RANK() OVER (PARTITION BY miesiac ORDER BY SUM(cena_sprzedazy) DESC) AS ranking NATURAL JOIN czas WHERE rok = '1999' GROUP BY dostawca, miesiac; DOSTAWCA MIESIAC SUMA RANKING ---------- ------- ---------- -------- D-Dell 1 1530196,44 1 BCF 1 93557,1 2 Tefal 1 90504,54 3 Touch Inc 1 32187,12 4 Agfa 1 28638,22 5 CD Inc 1 20182,96 6 Mop Inc 1 18741,32 7 Ricoh 1 4871,2 8 D-Dell 2 1530196,44 1 BCF 2 93557,1 2 Tefal 2 90504,54 3 Touch Inc 2 32187,12 4 Agfa 2 28638,22 5 CD Inc 2 20182,96 6 Mop Inc 2 18741,32 7 Ricoh 2 4759,16 8 Mop Inc 3 84 1 Mop Inc 4 11 1 13 14 CUME_DIST (1) CUME_DIST (2) Oblicza rozkład wartości w partycji Pokazuje, ile procent rekordów w partycji poprzedza w rankingu bieżący rekord: wyliczona wartość zawiera się zawsze w przedziale (0; 1> do wyliczonej wartości wlicza się bieżący rekord sposób wyliczenia CUME_DIST dla wartości x (x wyznacza ranking!): (liczba rekordów w partycji z wartościami w rankingu przed x razem z rekordami w partycji z wartością x) / liczba rekordów w partycji Przykład (bez partycjonowania, ranking malejący): Znajdź względne pozycje poszczególnych dostawców w rankingu ze względu na sumę cen sprzedaży produktów przez nich dostarczanych SELECT dostawca, SUM(cena_sprzedazy) AS suma, CUME_DIST() OVER (ORDER BY SUM(cena_sprzedazy) DESC) AS cume_dist, 100*CUME_DIST() OVER (ORDER BY SUM(cena_sprzedazy) DESC) AS proc GROUP BY dostawca; CUME_DIST() OVER ([<definicja partycji>] <porządek sortowania> [NULLS FIRST NULLS LAST]) znaczenie poszczególnych elementów analogiczne jak dla RANK i DENSE_RANK (0+1)/8 -> (1+1)/8 -> (2+1)/8 -> (7+1)/8 -> DOSTAWCA SUMA CUME_DIST PROC ---------- ---------- ---------- ------- D-Dell 3060392,88,125 12,5 BCF 187114,2,25 25 Tefal 181009,08,375 37,5 Touch Inc 64374,24,5 50 Agfa 57276,44,625 62,5 CD Inc 40365,92,75 75 Mop Inc 37577,64,875 87,5 Ricoh 9630,36 1 100 15 16

PERCENT_RANK (1) PERCENT_RANK (2) Wylicza procentowy ranking w partycji wartości z bieżącego rekordu w stosunku do zbioru wartości w partycji: wyliczona wartość zawiera się zawsze w przedziale <0; 1> działa podobnie jak CUME_DIST, ale pomija bieżący rekord sposób wyliczenia PERCENT_RANK dla rekordu: (pozycja rankingowa rekordu w partycji 1) / (liczba rekordów w partycji 1) Przykład (bez partycjonowania, ranking malejący): Znajdź ranking procentowy poszczególnych dostawców w rankingu ze względu na sumę cen sprzedaży produktów przez nich dostarczanych SELECT dostawca, SUM(cena_sprzedazy) AS suma, PERCENT_RANK() OVER (ORDER BY SUM(cena_sprzedazy) DESC) AS PERCENT_RANK GROUP BY dostawca; PERCENT_RANK() OVER ([<definicja partycji>] <porządek sortowania> [NULLS FIRST NULLS LAST]) znaczenie poszczególnych elementów analogiczne jak dla CUME_DIST DOSTAWCA SUMA PERCENT_RANK ---------- ---------- ------------ D-Dell 3060392,88 0 <- (1-1)/(8-1) BCF 187114,2,142857143 <- (2-1)/(8-1) Tefal 181009,08,285714286 <- (3-1)/(8-1) Touch Inc 64374,24,428571429 Agfa 57276,44,571428571 CD Inc 40365,92,714285714 Mop Inc 37577,64,857142857 Ricoh 9630,36 1 <- (8-1)/(8-1) 17 18 ROW_NUMBER (1) ROW_NUMBER (2) Przydziela każdemu rekordowi w partycji unikalny numer: wartości generowane sekwencyjnie od 1 ROW_NUMBER() OVER ([<definicja partycji>] <porządek sortowania> [NULLS FIRST NULLS LAST]) znaczenie poszczególnych elementów analogiczne jak dla CUME_DIST Uwaga! Funkcja niedeterministyczna! Przykład: ranking ze względu na sumę cen kilka pozycji z tą samą wartością wyrażenia tworzącego ranking DOSTAWCA SUMA ROW_NUMBER ---------- ---------- ---------- D-Dell 3060392,88 1 BCF 187114,20 2 Tefal 181009,08 3 Touch Inc 64374,24 4 Agfa 57276,44 5 Mop Inc 57276,44 6 CD Inc 57276,44 7 Ricoh 9630,36 8 Przykład (partycjonowanie, ranking malejący): Nadaj kolejne numery rekordów w rankingu dostawców zbudowanym ze względu na sumę cen sprzeda- DOSTAWCA MIESIAC SUMA ROW_NUMBER ży produktów przez nich dostarczanych, z podziałem na kolejne miesiące 1999 roku SELECT dostawca, miesiac, SUM(cena_sprzedazy) AS suma, ROW_NUMBER() OVER ( PARTITION BY miesiac ORDER BY SUM(cena_sprzedazy) DESC) AS ROW_NUMBER NATURAL JOIN czas WHERE rok = '1999' GROUP BY dostawca, miesiac; ---------- ------- ---------- ---------- D-Dell 1 1530196,44 1 BCF 1 93557,1 2 Tefal 1 90504,54 3 Touch Inc 1 32187,12 4 Agfa 1 28638,22 5 CD Inc 1 20182,96 6 Mop Inc 1 18741,32 7 Ricoh 1 4871,2 8 D-Dell 2 1530196,44 1 BCF 2 93557,1 2 Tefal 2 90504,54 3 Touch Inc 2 32187,12 4 Agfa 2 28638,22 5 CD Inc 2 20182,96 6 Mop Inc 2 18741,32 7 Ricoh 2 4759,16 8 Mop Inc 3 84 1 Mop Inc 4 11 1 19 20

NTILE (1) Dokonuje podziału rekordów w partycji na wskazaną liczbę grup, każda każdy grupa w partycji otrzymuje numer unikalny gdy liczba rekordów w partycji nie pozwala na równy podział na grupy, dodatkowe rekordy przypisane zostają do grup z najniższymi numerami, liczba rekordów w grupach różni się o co najwyżej 1: np. podział 103 rekordów na 5 grup: 21 rek., 21 rek., 21 rek., 20 rek., 20 rek. NTILE(<wyrażenie>) OVER ([<definicja partycji>] <porządek sortowania> [NULLS FIRST NULLS LAST]) <wyrażenie> określa liczbę grup w partycji, znaczenie pozostałych elementów identyczne jak w CUME_DIST Uwaga! Funkcja niedeterministyczna (podobnie jak ROW_NUMBER) NTILE (2) Przykład (bez partycjonowania): Dla każdego miesiąca 1999 roku wylicz kwotę sprzedaży, podziel wynik na kwartały SELECT miesiac, SUM(cena_sprzedazy) AS suma, NTILE(4) OVER (ORDER BY miesiac) AS kwartał FROM czas NATURAL JOIN sprzedaz WHERE rok = 1999 GROUP BY miesiac; MIESIAC SUMA KWARTAŁ ---------- ---------- ---------- 1 1819005,90 1 2 1818966,86 1 3 3234213,90 1 4 874345,21 2 5 1819015,9 2 6 1818954,86 2 7 592300,84 3 8 4974302,42 3 9 3575380,00 3 10 964978,21 4 11 3098762,31 4 12 1298764,10 4 21 22 Funkcje rankingu hipotetycznego (1) Funkcje rankingu hipotetycznego (2) Umożliwiają analizę "co, jeśli", wyznaczając hipotetyczny ranking wartości RANK DENSE_RANK PERCENT_RANK CUME_DIST (<wyrażenie>) WITHIN GROUP (<porządek sortowania> {NULLS FIRTS NULLS LAST}) "Na którym miejscu w rankingu dostawców produktów znalazłby się dostawca, dla którego sprzedaż produktów wynosi 100 000 zł?" SELECT RANK(100000) WITHIN GROUP (ORDER BY SUM(cena_sprzedazy) DESC) AS pozycja GROUP BY dostawca; POZYCJA -------- 4 DOSTAWCA SUMA RANKING ---------- ---------- ---------- D-Dell 3060392,88 1 BCF 187114,20 2 Tefal 181009,08 3 Touch Inc 64374,24 4 Agfa 57276,44 5 CD Inc 40365,92 6 Mop Inc 37577,64 7 Ricoh 9630,36 8 23 24

Funkcje okna Funkcje agregujące, wyliczające wartość dla bieżącego rekordu, biorąc pod uwagę wartości innych rekordów należących do tego samego okna co bieżący rekord początek okna koniec okna wylicz średnią wielkość sprzedaży z bieżącego miesiąca i trzech miesięcy poprzedzających bieżący miesiąc 1 1819005,90 1 2 1818966,86 1 3 3234213,90 1 4 874345,21 2 5 1819015,09 2 6 1818954,86 2 7 592300,84 3 8 4974302,42 3 9 3575380,00 3 początek okna koniec okna 1 1819005,90 1 2 1818966,86 1 3 3234213,90 1 4 874345,21 2 5 1819015,09 2 6 1818954,86 2 7 592300,84 3 8 4974302,42 3 9 3575380,00 3 Definicja okna (1) { ROWS RANGE } < definicja typu okna (fizyczne lub logiczne) { BETWEEN < definicja początku okna { UNBOUNDED PRECEDING CURRENT ROW <wyrażenie> { PRECEDING FOLLOWING }} AND < definicja końca okna { UNBOUNDED FOLLOWING CURRENT ROW <wyrażenie> { PRECEDING FOLLOWING }} { UNBOUNDED PRECEDING CURRENT ROW <wyrażenie> PRECEDING }} 25 26 Definicja okna (2) Definicja okna (3) Typ okna: ROWS okno fizyczne, rozmiar wyrażony w liczbie rekordów RANGE okno logiczne, rozmiar zdefiniowany przez wyrażenie logiczne, wyliczający przesunięcie względem bieżącego rekordu: przykłady: 2 miesiące przed i 1 miesiąc po, typ wartości wyrażenia musi być zgodny z typem wartości wyrażenia porządkującego rekordy w partycji Rozmiar okna: UNBOUNDED PRECEDING początkiem okna jest pierwszy rekord partycji UNBOUNDED FOLLOWING końcem okna jest ostatni rekord partycji CURRENT ROW początkiem (końcem) okna jest: dla ROWS bieżący rekord w partycji dla RANGE wskazana wartość w bieżącym rekordzie partycji <wyrażenie> PRECEDING: dla ROWS przesunięcie wyrażone w liczbie rekordów od bieżącego rekordu do początku okna dla RANGE przesunięcie logiczne od bieżącego rekordu do początku okna <wyrażenie> FOLLOWING: dla ROWS przesunięcie wyrażone w liczbie rekordów od bieżącego rekordu do końca okna dla RANGE przesunięcie logiczne od bieżącego rekordu do końca okna 27 28

Definicja okna (4) Definicja okna (5) Przykłady definicji okna: okno fizyczne o rozmiarze 16 rekordów: 5 przed bieżącym rekordem + bieżący rekord + 10 po bieżącym rekordzie ROWS BETWEEN 5 PRECEDING AND 10 FOLLOWING Przykłady definicji okna (cd): okno logiczne obejmujące 6 miesięcy wstecz RANGE INTERVAL 5 MONTH PRECEDING okno fizyczne od początku partycji do bieżącego rekordu ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW okno logiczne o rozmiarze 10 ubiegłych dni i 5 dni przyszłych RANGE BETWEEN INTERVAL 10 DAY PRECEDING AND INTERVAL 5 DAY FOLLOWING Uwaga! Pominięcie definicji okna powoduje przyjęcie poniższego okna: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW okno logiczne zawierające rekordy o wartościach większych bądź równych 10 i mniejszych bądź równych 20 RANGE BETWEEN 10 PRECEDING AND 20 FOLLOWING 29 30 Przykłady (1) Przykłady (2) Przykład 1. (bez partycjonowania): Dla każdego miesiąca pierwszej połowy 1999 roku wylicz sumaryczną kwotę sprzedaży, podaj również dla każdego miesiąca sumaryczną sprzedaż od początku roku SELECT miesiac, SUM(cena_sprzedazy) AS miesiecznie, SUM(SUM(cena_sprzedazy)) OVER(ORDER BY miesiac ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS narastajaco FROM czas JOIN sprzedaz USING(czas_id) WHERE rok = 1999 AND miesiac <=6 GROUP BY miesiac ORDER BY miesiac; MIESIAC MIESIECZNIE NARASTAJACO ------- ----------- ----------- 1 1819005,90 1819005,90 2 1818966,86 3637972,76 3 3234213,90 6872186,66 4 874345,21 7746531,87 5 1819015,90 9565547,77 6 1818954,86 11384502,63 SUM(SUM(cena_sprzedazy)) OVER(ORDER BY miesiac ROWS UNBOUNDED PRECEDING) albo SUM(SUM(cena_sprzedazy)) OVER(ORDER BY miesiac) 31 Przykład 2. (partycjonowanie): Podaj sumaryczną dzienną sprzedaż produktów w pierwszym kwartale 2001 roku, dodatkowo wylicz procentowy udział sprzedaży dziennej w stosunku do sumarycznej sprzedaży tygodniowej SELECT czas_id AS data, numer_tygodnia_w_roku AS nr_tyg, sum(cena_sprzedazy) AS suma_dzien, ROUND(100*SUM(cena_sprzedazy)/SUM(SUM(cena_sprzedazy)) OVER (PARTITION BY numer_tygodnia_w_roku ORDER BY czas_id RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)) AS "%TYG" FROM sprzedaz JOIN czas USING(czas_id) DATA NR_TYG SUMA_DZIEN %TYG WHERE rok = 2001 AND kwartal = 1 -------- ------ ---------- ----- 01/01/01 1 12 5 GROUP BY czas_id, numer_tygodnia_w_roku 01/01/02 1 32 13 ORDER BY czas_id; 01/01/03 1 9 4 01/01/04 1 32 13 01/01/05 1 54 21 01/01/06 1 72 28 01/01/07 1 43 17 01/01/08 2 47 15 01/01/09 2 54 17 01/01/10 2 93 30 01/01/11 2 32 10 32

Dodatkowe funkcje Funkcje raportujące (1) FIRST_VALUE, LAST_VALUE wyznacza wartość w pierwszym/ostatnim rekordzie partycji Podaj sumaryczną dzienną sprzedaż produktów w pierwszym kwartale 2001 roku, porównaj sprzedaż dzienną z sumaryczną sprzedażą każdego pierwszego dnia tygodnia SELECT czas_id AS data,numer_tygodnia_w_roku AS nr_tyg,sum(cena_sprzedazy) AS suma_dzien, SUM(cena_sprzedazy)-FIRST_VALUE(SUM(cena_sprzedazy)) OVER (PARTITION BY numer_tygodnia_w_roku ORDER BY czas_id DATA NR_TYG SUMA_DZIEN ZMIANA RANGE BETWEEN UNBOUNDED PRECEDING -------- ------ ---------- ------ 01/01/01 1 12 0 AND UNBOUNDED FOLLOWING) AS zmiana FROM sprzedaz JOIN czas USING(czas_id) WHERE rok = 2001 AND kwartal = 1 GROUP BY czas_id, numer_tygodnia_w_roku ORDER BY czas_id; 01/01/02 1 32 20 01/01/03 1 9-3 01/01/04 1 32 20 01/01/05 1 54 42 01/01/06 1 72 60 01/01/07 1 43 31 01/01/08 2 47 0 01/01/09 2 54 7 01/01/10 2 93 46 01/01/11 2 32-15 33 Wyliczają zagregowane wartości na podstawie wartości wszystkich rekordów w partycji Funkcje: SUM, AVG, MAX, MIN, COUNT, STDDEV, VARIANCE Ich wyniki są dostępne dla każdego rekordu w partycji <nazwa funkcji> OVER ([<definicja partycji>]) gdy brak definicji partycji, funkcja wylicza wartość na podstawie wszystkich rekordów zapytania 34 Funkcje raportujące (2) Funkcja RATIO_TO_REPORT (1) Dla każdego produktu podaj jego sumaryczną kwotę sprzedaży oraz sumaryczną kwotę sprzedaży wszystkich produktów, należących do tej samej kategorii, co dany produkt SELECT nazwa_produktu, kategoria, SUM(cena_sprzedazy) as SPRZ_PROD, SUM(SUM(cena_sprzedazy)) OVER (PARTITION BY kategoria) AS SPRZ_KAT FROM produkty JOIN sprzedaz USING(produkt_id) GROUP BY nazwa_produktu, kategoria ORDER BY nazwa_produktu, kategoria; NAZWA_PRODUKTU KATEGORIA SPRZ_PROD SPRZ_KAT -------------- ---------- --------- ---------- Komputer LX8 ELEK 135045,88 3560155,2 Lampa SX5 ELEK 2299,08 3560155,2 Lampa LX8 ELEK 2223,08 3560155,2 Kuchenka LX3 ELEK 29372,11 3560155,2 Kuchenka SX1 ELEK 6704,04 3560155,2 Mop SX8 KUCH 1441,64 37577,64 Mop LX9 KUCH 273,90 37577,64 Mop TX2 KUCH 4343,99 37577,64 Mop SX5 KUCH 7435,99 37577,64 Mop SX3 KUCH 4983,76 37577,64 Wylicza stosunek wartości wyrażenia do sumy wartości wyrażenia ze wszystkich rekordów partycji dla wyrażenia x: x/sum(x) RATIO_TO_REPORT(<wyrażenie>) OVER ([<definicja partycji>]) gdy brak definicji partycji, funkcja wylicza wartość na podstawie wszystkich rekordów zapytania 35 36

Funkcja RATIO_TO_REPORT (2) Dla każdego produktu podaj jego sumaryczną kwotę sprzedaży oraz procentowy udział tej kwoty w sumarycznej kwocie sprzedaży wszystkich produktów, należących do tej samej kategorii, co dany produkt SELECT nazwa_produktu, kategoria, SUM(cena_sprzedazy) as sprz_prod, ROUND(100*RATIO_TO_REPORT(SUM(cena_sprzedazy)) OVER(PARTITION BY kategoria),2) AS "UDZ%" NAZWA_PRODUKTU KATEGORIA SPRZ_PROD UDZ% FROM produkty JOIN sprzedaz -------------- ---------- --------- ------ USING(produkt_id) GROUP BY nazwa_produktu, kategoria Komputer LX8 ELEK 135045,88 3,79 Lampa SX5 ELEK 2299,08 0,06 ORDER BY nazwa_produktu, kategoria; Lampa LX8 ELEK 2223,08 0,06 Kuchenka LX3 ELEK 29372,11 0,83 Kuchenka SX1 ELEK 6704,04 0,19 Mop SX8 KUCH 1441,64 3,84 Mop LX9 KUCH 273,90 0,73 Mop TX2 KUCH 4343,99 11,56 Mop SX5 KUCH 7435,99 19,79 Mop SX3 KUCH 4983,76 13,26 Funkcje LAG/LEAD (1) Pozwalają na odczyt wartości, znajdujących się w rekordach partycji sąsiadujących z bieżącym rekordem LAG LEAD(<wyrażenie> [,przesunięcie] [,wartość domyślna]) OVER ([<definicja partycji>] <porządek sortowania>) wyrażenie atrybut, którego wartość funkcja ma odczytać przesunięcie określa numer rekordu w stosunku do bieżącego rekordu, z którego wartość ma zostać odczytana (domyślnie 1) LAG sięga do tyłu (np. 1 rekord poprzedni) LEAD sięga do przodu (np. 1 rekord następny) wartość domyślna wartość, jaką przyjmie funkcja w sytuacji, gdy przesunięcie zaadresuje rekord "poza" partycją lub relacją 37 38 Funkcje LAG/LEAD (2) Funkcje FIRST/LAST (1) Podaj sumaryczną dzienną sprzedaż produktów w pierwszym kwartale 2001 roku, dla każdego dnia podaj również sumaryczną sprzedaż z dnia poprzedniego (wypisz 0 jeśli dane o sprzedaży z poprzedniego dnia nie są dostępne) SELECT czas_id as data, SUM(cena_sprzedazy) AS suma_dzien, LAG(SUM(cena_sprzedazy),1,0) OVER (ORDER BY czas_id) AS suma_pop_dzien FROM sprzedaz JOIN czas USING(czas_id) WHERE rok = 2001 AND kwartal = 1 GROUP BY czas_id ORDER BY czas_id; DATA SUMA_DZIEN SUMA_POP_DZIEN -------- ---------- -------------- 01/01/01 12 0 01/01/02 32 12 01/01/03 9 32 01/01/04 32 9 01/01/05 54 32 01/01/06 72 54 01/01/07 43 72 01/01/08 47 43 01/01/09 54 47 01/01/10 93 54 01/01/11 32 93 Znajdują pierwsze/ostatnie rekordy w rankingu i stosują funkcję agregującą na ich wartościach nazwa_funkcji(<wyrażenie>) KEEP (DENSE_RANK {FIRST LAST} <porządek sortowania>) [OVER (<definicja partycji>)] Działają jako: 1. zwykłe funkcje agregujące pomijamy definicję partycji, funkcja działa na całej grupie rekordów, definiowanej przez klauzulę GROUP BY 2. agregujące funkcje raportujące działają w ramach partycji 39 40

Funkcje FIRST/LAST (2) Przykład 1. (zwykła funkcja agregująca): Podaj sumaryczną miesięczną sprzedaż produktów 1999 roku, dla każdego miesiąca podaj datę, w którym zanotowano sprzedaż na najwyższą kwotę SELECT miesiac, SUM(cena_sprzedazy) AS sprz_mies, MAX(czas_id) KEEP (DENSE_RANK FIRST ORDER BY cena_sprzedazy DESC) AS maks_sprz FROM sprzedaz JOIN czas USING (czas_id) WHERE rok = '1999' GROUP BY miesiac ORDER BY miesiac; MIESIAC SPRZ_MIES MAKS_SPR -------- --------- -------- 1 1819005,9 99/01/11 2 1818966,86 99/02/02 3 37403,99 99/03/12 4 98444,09 99/04/21 5 348437,79 99/05/30 6 44749,87 99/06/20 7 139439,53 99/07/13 8 2873132,42 99/08/02 9 159393,12 99/09/14 10 843004,33 99/10/23 11 732304,87 99/11/30 12 1234434,65 99/12/23 Funkcje FIRST/LAST (3) Przykład 2. (raportująca funkcja agregująca): Dla każdej transakcji sprzedaży, przeprowadzonej w 1999 roku, podaj jej kwotę oraz różnicę pomiędzy kwotą transakcji a kwotą pierwszej transakcji sprzedaży w miesiącu SELECT czas_id AS data, cena_sprzedazy, cena_sprzedazy - MIN(cena_sprzedazy) KEEP (DENSE_RANK LAST ORDER BY czas_id DESC) OVER (PARTITION BY miesiac) AS roznica FROM sprzedaz JOIN czas USING(czas_id) DATA CENA_SPRZEDAZY ROZNICA WHERE rok = 1999 -------- -------------- -------- ORDER BY data; 99/01/01 231 0 99/01/02 123-108 99/01/03 543 312 99/01/31 434 0 99/02/01 213-221 99/02/02 432-2 99/02/03 323-111 41 42 Bibliografia Dokumentacja Oracle 10g - http://www.oracle.com/technology/documentation/database10gr2.html 43