Dnes: 19. září 2017    | Registrace | Hledáme | Redakce | Info | Testy | Školení | Ocenění | Nápověda | Čtenář: nepřihlášen

Rychlé odkazy
  • Hlavní stránka
  • Seznam rubrik
  • Ankety
  • Editoriály
  • TOP 15
  • KONFERENCE 2008
  • KONFERENCE 2007
  • KONFERENCE 2006
  • KONFERENCE 2005
  • KONFERENCE 2004
  • Sborník
  • Testy
  • Virtuální školení
  • Personalizace


  • Hledáte práci?
    Hledáme redaktora - pojďte s námi tvořit Databázový svět!

    Vyhledávání

    Hledej
    na Databázovém světě!



    Rozšířené vyhledávání

    Rubriky
    Aktuality
    Bezpečnost
    Business
    Česká scéna
    Datové sklady
    Dokumentace
    Dotazovací jazyky
    Hardware
    Historie
    Komentáře
    Literatura
    Metodologie
    Nondb
    Open Source
    Poradna
    Produkty
    Případové studie
    Redakce
    Rozhovory
    Standardy
    Technologie
    Tipy - triky
    Tiskové zprávy
    Vývoj
    Vývojové nástroje
    Zajímavosti

    Co je to?
    SŘBD
    (Systém řízení báze dat)

    Programový systém umožňující vytváření, údržbu a použití báze dat. Podle komplexnosti je možné SŘBD rozdělit na nižší (např. PC Fand), střední (FoxPro) a vyspělé (Oracle 9i).

    Akce
    Dynamická Datová Centra
    - na semináři se seznámíte s komplexním řešením a koncepcí Dynamických Datových Center od Fujitsu Siemens Computers se speciálním důrazem na řešení FlexFrame.

    Textová inzerce
    IBPhoenix - Vše o InterBase a Firebirdu.

    Smějete se rádi? - Pak je pro vás Vtipník to pravé!

    Prodejce reklamy - Hledáme schopného prodejce reklamního prostoru, možnost i externí spolupráce.

    Přihlášený čtenář
    Nepřihlášený čtenář

    O portálu
    Databázový svět
    ISSN: 1213-5933

    Web je optimalizován pro rozlišení 1024x768, nicméně kromě větších rozlišení podporujeme i 800x600. Podrobnosti najdete zde.

    Chcete-li mít kdykoliv možnost zkontrolovat obsah našeho portálu, můžete využít podporu rss. Podrobnosti najdete zde.
    Tipy a triky pro Oracle IV. – analytické funkce podruhé


    [Tipy - triky] - Ve čtvrtém pokračování seriálu věnovaného praktickým tipům a trikům pro databázovou platformu Oracle Database se opět podíváme na to, jak vám v Oracle mohou pomoci analytické funkce vyhnout se komplikovaným dotazům. Cílem seriálu je přinášet vám nejen praktické informace, které vám mohou pomoci při správě či vývoji na této platformě, ale také upozorňovat na zajímavé funkce. O kterých možná ani nevíte, že existují.



    V predošlom dieli sme sa zmienili o existencii analytických funkcií v Oracle databáze (link). Dnes by sme sa zamerali na spôsob ich spracovania a ukázali si ďalší spôsob ich použitia.

    Výhodou analytických funkcií je možnosť zadefinovať výpočty nad zoskupeniami riadkov podľa iného kľúča ako sú zoskupenia výstupnej množiny riadkov – tzv. "row partitioning" (napríklad – celý výstup je zotriedený podľa lokality, výpočet ale robíme podľa typu produktu bez ohľadu na lokalitu). Druhou výhodou je možnosť zahrnúť do výpočtu v rámci jedného riadku predošlé alebo nasledujúce riadky – tzv. "windowing".


    Spôsob spracovania AF a "Windowing"

    Využitím týchto vlastností sa pomocou analytických funkcií dajú formulovať dotazy, ktoré by boli v ANSI SQL monštrózne.

    Ako príklad si zoberme demo schému SH (Sales History) a predpokladajme nasledovné požiadavky od analytikov obchodného oddelenia:

    1. Percentuálny podiel na predaji podľa predajných kanálov.
    2. Poradie krajín podľa úspešnosti predaja v rámci jednotlivých svetových regiónov a rozdiel objemov predaja medzi jednotlivými poradiami.

    Skúste riešiť tieto úlohy v štandardnom SQL...

    Zaujíma nás predaj po distribučných kanáloch, takže dotaz bude zoskupený podľa nich (GROUP BY). Nemáme problém zistiť predaj za jednotlivé kanále. Na zistenie celkového predaja a percentuálneho podielu je potrebné zahrnúť do výpočtu všetky riadky – nielen riadky zoskupené pre daný kanál. Preto necháme časť analytickej funkcie definujúcu rozsah riadkov prázdnu a tým pádom sa analytická funkcia aplikuje na všetky riadky – SUM(...) OVER (). Funkcia RATIO_TO_REPORT nám vráti percentuálny podiel na celku. Aplikujeme ju obdobným spôsobom:

    SELECT ch.channel_desc KANAL, 
           SUM(amount_sold) as PREDAJ,
           SUM(SUM(amount_sold)) OVER () 
             as CELKOVY_PREDAJ,
           RATIO_TO_REPORT(SUM(amount_sold)) OVER () 
             as PODIEL_NA_PREDAJI
      FROM sales s, channels ch
      WHERE s.channel_id=ch.channel_id AND 
            s.time_id BETWEEN 
              TO_DATE('20001101','yyyymmdd') AND 
              TO_DATE('20001130','yyyymmdd')
      GROUP BY ch.channel_desc;
    

    Z výstupu vidíme, že sa za 11/2000 predalo 2060344 jednotiek tovaru. Z toho 54% cez priamych predajcov, 14% cez internet a 34% cez partnerov.

    Pri druhom zadaní si vzhľadom na jeho zložitosť necháme predložiť od zadávateľa vzorovú tabuľku – aby sa nám lepšie analyzoval problém.

    Základné zoskupenie je región a krajina (GROUP BY). Predaj bude jednoduchou sumou za zajednotlivé krajiny. Na určenie poradia využijeme analytickú funkciu RANK(). Chceme poradie v rámci regiónov, takže do particií budeme riadky rozdeľovať podľa nich (PARTITION BY country_region) a zoradovať budeme zostupne podľa predaja (ORDER BY SUM(amount_sold) DESC). Na to, aby sme získali rozdiel medzi 1. a 2. v poradí, potrebujeme dostať ich objemy predaja na jeden riadok. Na to využijeme analytickú funkciu LAG(), ktorá posunie stĺpec o daný počet riadkov (v našom prípade jeden) a odčítame ho od objemu pre krajinu z daného riadku.

    Posun robíme opäť len v rámci regiónov, takže prvý v poradí nemá predchodcu. Pokiaľ by sme chceli urobiť posun opačným smerom, použili by sme analytickú funkciu LEAD(). Výsledný dotaz bude vyzerať nasledovne:

    SELECT country_region REGION,
           country_name KRAJINA,
           SUM(amount_sold) PREDAJ,
           RANK() OVER (
             PARTITION BY country_region 
             ORDER BY SUM(amount_sold) DESC NULLS LAST
    					    ) 
             AS PORADIE,
             LAG(SUM(amount_sold),1) OVER (
               PARTITION BY  country_region 
               ORDER BY SUM(amount_sold) DESC
                       ) - SUM(amount_sold) ROZDIEL
      FROM sales, customers, countries
      WHERE sales.cust_id=customers.cust_id AND 
            customers.country_id = countries.country_id AND 
            sales.time_id BETWEEN  
              TO_DATE('20001101','yyyymmdd') AND 
              TO_DATE('20001130','yyyymmdd')
      GROUP BY country_name, country_region;
    

    Na prvý pohľad môžu analytické funkcie vyznieť ako nástroj na riešenie špecifických problémov. V momente, keď im porozumiete a zaradíte ich do svojho arzenálu nástrojov, veľmi rýchlo zistíte, že to tak nie je a pokiaľ sa pohybujete v prostredí business intelligence projektov časom si bez nich nebudete vedieť predstaviť efektívny dotaz.

    Dokumentáciu od analytických funkcií nájdete v Oracle Database Data Warehousing Guide (kapitola 21 SQL for Analysis and Reporting).

    Dnešní ukázky můžete vyzkoušet na libovolné edici Oracle Database, včetně volně dostupné Express Edition. V případě potřeby si Oracle Database můžete stáhnout na webu společnosti Oracle.

    O autorovi
    Peter Hora pôsobí ako BI/DW Solutions Architect. Svoje štúdia absolvoval na Slovensku, v Izraeli, Holandsku a Českej Republike. Od ich ukončenia sa zaoberá problematikou business intelligence a datawarehousingu s primárnym zameraním na finančný sektor (dátová konsolidácia, New Basel Capital Accord , profitabilita ...)

    Související články:
    Tipy a triky pro Oracle XVI. – rychlejší aplikace i bez změn dotazů podruhé (03.02.2009)
    Tipy a triky pro Oracle XV. – rychlejší aplikace i bez změn dotazů poprvé (21.11.2008)
    Tipy a triky pro Oracle XIV. – datová komprese (21.10.2008)
    Tipy a triky pro Oracle XIII. – externí data rychle (17.09.2008)
    Tipy a triky pro Oracle XII. – Jak na řízení přístupu na úrovni záznamů? (15.04.2008)
    Tipy a triky pro Oracle XI. – Error Logging Tables (12.11.2007)
    Tipy a triky pro Oracle X. – bojujete s češtinou v Oracle podruhé? (14.05.2007)
    Tipy a triky pro Oracle IX. – bojujete s češtinou v Oracle? (06.02.2007)
    Tipy a triky pro Oracle VIII. – jak na přenosy velkých dat podruhé (03.01.2007)
    Tipy a triky pro Oracle VII. – jak na přenosy velkých dat poprvé (21.11.2006)
    Tipy a triky pro Oracle VI. – trochu jiné triggery (25.09.2006)
    Tipy a triky pro Oracle V. – změna dat v pohledu? (06.09.2006)
    Tipy a triky pro Oracle III. – analytické funkce poprvé (19.07.2006)
    Tipy a triky pro Oracle II. – jak na hierarchické struktury? (07.06.2006)
    Tipy a triky pro Oracle I. – jak na automatické přidělování ID? (05.05.2006)

    ( Celý článek! | Autor: Peter Hora | Počet komentářů: 11 | Přidat komentář | Informační e-mailVytisknout článek )

    Vyhledávání
     

    Anketa
    Kolik ročně utratíte za dovolené?

    Nic 
     (1446 hl.)
    Do 1 000,- Kč 
     (1005 hl.)
    Do 10 000,- Kč 
     (950 hl.)
    Do 25 000,- Kč 
     (1207 hl.)
    Do 50 000,- Kč 
     (957 hl.)
    Do 75 000,- Kč 
     (1108 hl.)
    Více než 75 000,- Kč 
     (948 hl.)

    Celkem hlasovalo: 7621


    Poslední komentáře
    frontierd@126.com
    frontierd@126.com
    frontierd@126.com
    c
    http://www.coachoutl

    Newsletter
    Přihlaste si nezávazně - i bez registrace - odběr informačního newsletteru. Podrobné informace najdete zde.

    Emailová adresa:


    Kalendář
    <<  Září  >>
    PoÚtStČtSoNe
        123
    45678910
    11121314151617
    18192021222324
    252627282930 

    Redakci připojuje


    Nejčtenější

    Databáze je prázdná!


    Nejvíce komentářů

    Databáze je prázdná!


    Reklama






    Nenechte si ujít články na dalších webech




    Na této stránce použité názvy programových produktů, firem apod. mohou být ochrannými známkami
    nebo registrovanými ochrannými známkami příslušných vlastníků.

    Databázový svět | dfKlub - digitální fotografie | Vtipník - vtipy přímo k Vám | Reminder - přestaňte zapomínat | Databázový svět

    Copyright (c) 2004 AVRE Publishing, spol. s r.o. Všechna práva vyhrazena