Analýza a modelování dat Přednáška 9
Další dotazování nad kostkou
Rozšíření SQL99 rozšíření SQL99 (minulá přednáška): seskupovací operátory za GROUP BY CUBE statistiky dle řezů ROLLUP statistiky dle rolování nahoru - nadkrychle GROUPING SETS vlastní definice seskupujících množin díky těmto operátorům tvoříme v obyčejné relační databázi agregační dotazy nad tabulkami jako nad kostkou
MDX Dotazování pomocí MDX MultiDimensional expressions speciální dotazovací jazyk nad kostkami v rámci OLAP (OnLine Analytical Processing) navržen Microsoftem, standardizován podporován např. v Microsoft SQL Server Analysis Services nadstavba (nástroj) Microsoft SQL Serveru pro OLAP a data mining
Uložení kostky pro OLAP MOLAP - Multidimensional OLAP data a výsledky agregací jsou uloženy ve speciálním formátu ROLAP - Relational OLAP data a výsledky agregací jsou uloženy v relační databázi HOLAP Hybrid OLAP hybridní přístup MS podporuje všechny přístupy
Základní syntaxe SELECT osa1 ON COLUMNS, osa2 ON ROWS FROM kostka [ WHERE specifikace_řezu ] podobnost s SQL je pouze v klíčových slovech SELECT FROM, pracujeme s kostkou, ne s tabulkami
Základní syntaxe dotazy MDX nezpracovává databázový server, ale server OLAP (MS Analysis Services) jako klient může sloužit i MS excel MS Excel umí poslat serveru MS Analysis Services dotaz v MDX výsledek je primárně dvourozměrná tabulka tří a vícerozměrný se rozpadá na více dvourozměrných tabulek třírozměrný by mohl být akceptovatelný ve spojení s 3D brýlemi
Souřadnice bodů (2,4) (2015,Components)
Kostka tabulka prodej_baget takto by mohla být uložena kostka v ROLAP
Kostka Datum bod o souřadnicích (Trója, 30.10.2007,golf) má hodnotu 2 31.10.2007 30.10.2007 cvalík golf Trója Voršilská Menza Bageta
Kostka souřadnice (n-tice, tuple) (Trója, 30.10.2007,golf) neúplná souřadnice (Trója, 30.10.2007) jak se automaticky doplňují další? defaultní, jsou-li definovány všechny hodnoty agreguje se pro všechny členy v dané dimenzi první - pokud předchozí kroky nejsou aplikovatelné (např. u měr, které nemají all members) kostka vrátí z dané dimenze to první, co jí přijde pod ruku
Kostka koncepty: dimenze datum, bageta, menza míra (measure) počet prodaných kusů mohu mít i jiné míry cena, míra může být i vypočítaná zisk jako rozdíl tržeb a nákladů míru mohu chápat také jako další dimenzi (Trója, 30.10.2007,golf, 2)
zdroj: Jiří Neoral Kostka
Kostka co bychom viděli na předchozí obrazovce pro náš příklad? Cube prodej_baget Measure počet_kusu bageta datum menza
Dimenze dimenze mohou mít i úrovňovou hierarchii http://msdn.microsoft.com/en-us/library/aa216772(sql.80).aspx 2 dimenzionální míra, na data se můžeme dívat jako na 5 dimenzionální vektor (Source,Route,Time,Packages,Last)
Příklad: Dimenze rozšíření kostky prodeje na hierarchické dimenze: zachováme 3 dimenze a jednu míru prodané množství dimenze prodejního místa dimenze času dimenze výrobku
1. dimenze: dimenze místa Prodejna menza Voršilská Trója fakulta Právnická MFF
2. dimenze: dimenze času Čas rok pololetí1 leden 1.1.2016 únor pololetí2 červenec
3. dimenze: dimenze výrobku Výrobek bageta golf cvalík nápoj kofola pivo
Čas Kostka Výrobek Nápoj Bageta pivo kofola golf cvalík Trója Voršilská Menza Právnická MFF Fakulta Prodejna Výrobek Prodejna
Kostka přístup k datům [ ] : názvy dimenzí a souřadnic přístup přes hodnotu [Menza].[Trója] [Vyrobek].[Nápoj].[Kofola] přístup přes klíč [Menza].&[1] klíč hodnota pokud bychom samozřejmě měli v kolekci o Menzách definován klíč a klíčem by bylo ID
Kostka přístup k datům ( ) zbytek funkce, priorita matematických operací, n- tice ([Menza].[Trója],[Datum].[30.10.2007],[Bageta].[golf]) { } množiny (sety) souřadnic { ([Menza].[Trója],[Datum].[30.10.2007],[Bageta].[golf]), ([Menza].[Trója],[Datum].[30.10.2007],[Bageta].[golf]) }
Dotazy v DMX dotazy budeme formulovat nad kostkou bez hierarchie, pouze v některých případech použijeme hierarchii pro demonstraci nějakého jevu
Jednoduchý dotaz SELECT [DATUM].MEMBERS ON COLUMNS, [BAGETA].MEMBERS ON ROWS FROM prodej_baget MEMBERS znamená všechny hodnoty (pozice z dimenze), tj. všechny datumy a bagety
Jednoduchý dotaz dotaz agreguje prodeje: výsledek je tabulka: sloupce datumy řádky bagety 30.10.2007 31.10.2007 cvalík 9 11 golf 8 1
Jednoduchý dotaz odkazy na řádky a sloupce lze zapsat i ve formě čísel os sloupce: AXIS(0) řádky: AXIS(1) SELECT [DATUM].MEMBERS ON AXIX(0), [BAGETA].MEMBERS ON AXIS(1) FROM prodej_baget
Výběr pozice z dimenze SELECT [DATUM].[30.10.2007] ON COLUMNS, [BAGETA].MEMBERS ON ROWS FROM prodej_baget 30.10.2007 cvalík 9 golf 8
Výběr více pozic z dimenze uvažujme situaci, že dimenze Datum by měla více hodnot (pozic) 30.10.2007, 31.10.2007, 1.11.2007, atd. pokud bychom chtěli vybrat 2 pozice (pouze dva datumy do dvou sloupců), musíme z nich vytvořit množinu
SELECT Výběr více pozic z dimenze {[DATUM].[30.10.2017], [DATUM].[31.10.2017]} ON COLUMNS, [BAGETA].MEMBERS ON ROWS FROM prodej_baget 30.10.2007 31.10.2007 cvalík 9 11 golf 8 1
Výběr pozic z dimenze uvažujme hierarchický model chceme vypsat součet prodaných nápojů za celý rok do sloupců všechny prodejny do řádků pouze nápoje
Výběr pozic z dimenze Čas Prodejna Nápoj Bageta pivo kofola golf cvalík Trója Voršilská Menza Právnická MFF Fakulta Výrobek Prodejna
Výběr pozic z dimenze SELECT [PRODEJNA].MEMBERS ON COLUMNS, [VYROBEK].[NAPOJ].MEMBERS ON ROWS FROM prodej_baget Trója Voršilská Právnická MFF kofola XX ZZ AA BB pivo YY WW CC DD
Jednorozměrný výsledek agregační dotazy můžeme formulovat pouze do sloupců, tj. jednorozměrně v dotazu vynecháme ON ROWS osy nelze přeskakovat, nesmíme tedy vynechat ON COLUMNS a ponechat ON ROWS SELECT [DATUM].MEMBERS ON COLUMNS, FROM prodej_baget
Jednorozměrný výsledek sečte všechny prodeje dle datumů 30.10.2007 31.10.2007 17 12
Jednorozměrný výsledek chyba nelze přeskočit osy SELECT [DATUM].MEMBERS ON ROWS, FROM prodej_baget
SELECT Kompletní agregace FROM prodej_baget 29
Řez vrátíme se k jednoduchému modelu chceme vypsat tabulku s počtem prodaných kusů baget v jednotlivých dnech, ale pouze pro menzu Voršilská provedeme řez v rovině Voršilská
Datum Řez 31.10.2007 30.10.2007 cvalík golf Trója Voršilská Menza Bageta
Řez SELECT [DATUM].MEMBERS ON COLUMN, [BAGETA].MEMBERS ON ROWS FROM prodej_baget WHERE [MENZA].[Voršilská]
Řez 30.10.2007 31.10.2007 cvalík 5 4 golf 6 0
Řez řez mohu provést i ve více dimenzích za klauzulí WHERE napíši řezovou množinu mezi závorky ( ) provedeme řez (Voršilská, golf) SELECT [DATUM].MEMBERS ON COLUMN, FROM prodej_baget WHERE ([MENZA].[Voršilská], [Bageta].[Golf])
Datum Řez 31.10.2007 30.10.2007 cvalík golf Trója Voršilská Menza Bageta
Řez výsledek je jednodimenzionální, protože mám celkem 3 dimenze a ve dvou jsem provedl řez 30.10.2007 31.10.2007 6 0
Výrazy máme definováno více měr počet prodaných kusů (první míra) tržba za bagety náklady na nákup za bagety jsou v další hierarchické dimenzi MIRY chceme zjistit zisk zisk bude vypočítaná míra
Výrazy WITH MEMBER MIRY.ZISK AS 'MIRY.TZRBA MIRY.NAKLADY' SELECT [DATUM].MEMEBERS ON COLUMNS, [BAGETA].MEMBERS ON ROWS FROM Sales WHERE ( MIRY.ZISK )
Vícedimenzionální výsledek SELECT [DATUM].MEMEBERS ON AXIS(0), [BAGETA].MEMBERS ON AXIS(1), [MENZA].MEMBERS ON AXIS(2) FROM prodej_baget AXIS(2) = PAGES výsledek mohou být dvě tabulky, ne každý klient je umí zobrazit na obrazovce, budou pouze v reportu
Množiny pozic SELECT {[VYROBEK][NAPOJ].[PIVO], [VYROBEK].[BAGETA].MEMBERS } ON COLUMNS, [PRODEJNA].MEMBERS ON ROWS FROM prodej_baget