1 Analytic SQL
Oracle Analytic SQL Anderer Name: Windw functins Ab 8i Einfache Ansätze für kmplexe Prblemstellungen Mit Standard-SQL meist nicht der nicht elegant zu lösen Effizientere Abarbeitung als mit Standard-SQL Vermeiden vn PL/SQL-Cde Anwendung: Ranking Aggregierung Zeilenweise Verarbeitung Statistik Was-wäre-wenn -Szenarien Markus Schmidt 2
Anwendungsbeispiele Running ttals Zeilenweise Berechnung der kumulativen Umsätze, bei der jeder Datensatz die Summe der vrhergehenden Datensätze beinhaltet Anteil innerhalb einer Gruppe Berechnung des Anteils eines Gehalts bezgen auf die Gesamtsumme innerhalb einer Abteilung Tp-N-Abfragen Finde die N umsatzstärksten Prdukte pr Prduktgruppe Gleitender Durchschnitt Berechne den Durchschnittswert jeweils über die vrhergehenden N Datensätze Ranglisten Markus Schmidt 3
Syntax Analytic-Functin (<Argument1>,<Argument2>, <Argument3>) OVER ( <Query-Partitin-Clause> <Order-By-Clause> <Windwing-Clause> ) OVER - identifiziert Analytic Functin (Unterschied zu GROUP BY) PARTITION BY aggregiert Ergebnismengen in Gruppen (Partitinen) ORDER BY srtiert Daten innerhalb der Partitinen WINDOWING lgische Offsets innerhalb Teilergebnissen (Datensätze der Bereiche) Markus Schmidt 4
Beispiel Running Ttals SELECT ename, deptn, sal, (SELECT SUM (sal) FROM emp e1 WHERE e1.deptn < emp.deptn OR (e1.deptn = emp.deptn AND e1.ename <= emp.ename)) running_ttal, (SELECT SUM (sal) FROM emp e2 WHERE e2.deptn = emp.deptn AND e2.ename <= emp.ename) dept_ttal, (SELECT COUNT (ename) FROM emp e3 WHERE e3.deptn = emp.deptn AND e3.ename <= emp.ename) seq FROM emp ORDER BY deptn, ename SELECT ename, deptn, sal, SUM (sal) OVER (ORDER BY deptn, ename) running_ttal, SUM (sal) OVER (PARTITION BY deptn ORDER BY ename) dept_ttal, ROW_NUMBER () OVER (PARTITION BY deptn ORDER BY ename) seq FROM emp ORDER BY deptn, ename Beispiel Markus Schmidt 5
Erweiterte Syntax <ROWS RANGE> BETWEEN... AND UNBOUNDED PRECEDING start f partitin UNBOUNDED FOLLOWING end f partitin CURRENT ROW value_expr < PRECEDING FOLLOWING> Beispiele ROWS BETWEEN 1 PRECEDING and 1 FOLLOWING ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW RANGE BETWEEN INTERVAL '7' day PRECEDING AND CURRENT ROW RANGE BETWEEN 10 PRECEDING AND 10 FOLLOWING Markus Schmidt 6
Standard-Aggregatfunktinen ROW_NUMBER() SUM(), MIN(), MAX(), AVG() LAG() LEAD() RANK() DENSE_RANK() PERCENT_RANK() NTILE() FIRST_VALUE() LAST_VALUE() FIRST() LAST() STATISTICAL FUNCTIONS Markus Schmidt 7
Gruppenbildung Partitin By Aufteilung der Ergebnismenge in Gruppen Partitinierung ist beliebiger Ausdruck, jedch keine Gruppenfunktin zulässig Einige Funktinen unterstützen Windw-Klausel zur weiteren Begrenzung SELECT emplyee_id, department_id, COUNT (*) OVER (PARTITION BY department_id) DEPT_COUNT FROM emplyees Beispiel Markus Schmidt 8
Unterschied zu Grup By GROUP BY Spaltenliste darf nur gruppierte Spalten swie Spalten mit Gruppenfunktin enthalten Gruppierung erflgt nur nach Spalten in Grup By-Ausdruck Analytic Functins Gruppenwerte können mehrfach erscheinen Nutzung vn Spalten hne Gruppenfunktin möglich Markus Schmidt 9
Executin Plans Beispiel SELECT deptn, COUNT(*) DEPT_COUNT FROM emp WHERE deptn IN (20, 30) GROUP BY deptn; SELECT deptn, empn, COUNT(*) OVER (PARTITION BY deptn) CNT FROM emp WHERE deptn IN (20, 30) ORDER BY 1; Markus Schmidt 10
Srtierung innerhalb Partitinen Srtierung innerhalb Partitinen <> Srtierung des Gesamtergebnisses (PARTITION BY ORDER BY ) Srtierung der Partitinen kann Einfluss auf Ergebnis haben: SELECT ename, deptn, sal, SUM (sal) OVER (ORDER BY ename, deptn) sum_ename_deptn, SUM (sal) OVER (ORDER BY deptn, ename) sum_deptn_ename FROM emp ORDER BY ename, deptn Beispiel Markus Schmidt 11
Tuning Läuft ein Vielfaches schneller als nrmales SQL Andere Möglichkeiten als reines SQL Tuning wie üblich: Indizierung Partitining Parallelisierung Markus Schmidt 12
Beispiel Ranking RANK() Evtl. mit Lücken DENSE_RANK() Ohne Lücken LAST_NAME SALARY NORMAL_RANK DENSE_RANK King 24000 1 1 Kchhar 17000 2 2 De Haan 17000 2 2 Russell 14000 4 3 Partners 13500 5 4 Hartstein 13000 6 5 Greenberg 12008 7 6 Higgins 12008 7 6 Errazuriz 12000 9 7 Ozer 11500 10 8 SELECT ename, sal, RANK () OVER (ORDER BY sal DESC) nrmal_rank, DENSE_RANK () OVER (ORDER BY sal DESC) DENSE_RANK FROM emp; Beispiel Markus Schmidt 13
Beispiel LEAD und LAG LEAD: bestimmte vrhergehende Datensätze für die Berechnung verwenden LAG: bestimmte flgende Datensätze für die Berechnung verwenden LEAD (<sql_expr>, <ffset>, <default>) OVER (<analytic_clause>) LAG (<sql_expr>, <ffset>, <default>) OVER (<analytic_clause>) SELECT deptn, empn, sal, LEAD (sal, 1, 0) OVER (PARTITION BY deptn ORDER BY sal DESC NULLS LAST) NEXT_LOWER_SAL, LAG (sal, 1, 0) OVER (PARTITION BY deptn ORDER BY sal DESC NULLS LAST) PREV_HIGHER_SAL FROM emp WHERE deptn IN (10, 20) ORDER BY deptn, sal DESC; Beispiel Markus Schmidt 14
Weitere Beispiele Gleitender Durchschnitt Über 3 Datensätze SELECT satznummer, wert, avg(wert) OVER (ORDER BY satznummer ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM tabelle Über 3 Tage SELECT tag, wert, avg(wert) OVER (ORDER BY BEGIN_INTERVAL_TIME RANGE BETWEEN interval 1 day PRECEDING AND 1 day FOLLOWING) FROM tabelle Markus Schmidt 15
Weitere Beispiele Summenbildung, Ttale und Subttale, Anteil SELECT DISTINCT prd_id, ttal, subttal, ROUND (subttal / ttal * 100, 2) anteil FROM (SELECT prd_id, SUM (quantity_sld) OVER () ttal, SUM (quantity_sld) OVER (PARTITION BY prd_id) subttal FROM sales) ORDER BY anteil DESC Beispiel Markus Schmidt 16
Weitere Beispiele Daten auf verschiedene Töpfe ( buckets ) verteilen Mit einer festgelegten Anzahl vn Elementen pr Tpf SELECT prd_list_price, prd_name, CEIL (ROW_NUMBER () OVER (ORDER BY prd_list_price) / 4) grp FROM prduct Mit einer bestimmten Anzahl vn Töpfen SELECT prd_list_price, prd_name, NTILE (10) OVER (ORDER BY prd_list_price) grp, FROM prducts Beispiel Markus Schmidt 17
Fragen? Markus Schmidt 18
Kntakt Essential Bytes GmbH & C. KG Markus Schmidt Steinebühlstraße 30 77749 Hhberg mschmidt@essential-bytes.de http://www.essential-bytes.de Markus Schmidt 19