Analytische Auswertungen in SQL - LV Datenorientierte Systemanalyse, WS 2014/15 Dr. Walter Ebner, Institut für ...
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
Analytische Auswertungen in SQL LV Datenorientierte Systemanalyse, WS 2014/15 Dr. Walter Ebner, Institut für Informationswirtschaft Wirtschaftsuniversität Wien
Überblick Datenorientierte Systemanalyse – Analytische Auswertungen • Funktionen und Operatoren – Logische Operatoren – Vergleichsoperatoren – Mathematische Operatoren und Funktionen – Zeichenketten Funktionen – Pattern Matching – Formatierungsfunktionen • Konditionale Ausdrücke • Aggregatsfunktionen • Window Functions 5
Logische Operatoren Datenorientierte Systemanalyse – Analytische Auswertungen AND Logische Konjunktion OR Logische Disjunktion NOT Logische Negation Die Präzedenz (Reihenfolge der Abarbeitung) der Operatoren ist: 1. NOT 2. AND 3. OR 6
Vergleichsoperatoren Datenorientierte Systemanalyse – Analytische Auswertungen < kleiner > größer = größer oder gleich = ist gleich oder != ist ungleich • a BETWEEN x AND y oder a NOT BETWEEN x AND y • expression IS NULL • expression IS NOT NULL Achtung: expression=NULL funktioniert nicht, da es immer FALSE ist. 7
Mathematische Operatoren Datenorientierte Systemanalyse – Analytische Auswertungen + Addition - Subtraktion * Multiplikation / Division (Ganzzahlendivision schneidet den Rest ab) % Modulo (Rest einer Ganzzahlendivision) ^ Potenzierung (2^3=8) ! Fakultät (5!=5*4*3*2*1=120) • Daneben gibt es noch eine Reihe von bitweisen Operatoren 8
Mathematische Funktionen Datenorientierte Systemanalyse – Analytische Auswertungen abs(x) Absolutbetrag (negatives Vorzeichnen wird entfernt) ln(x) Natürlicher Logarithmus log(x) Logarithmus mit Basis 10 pi() Die Kreiszahl Pi (3.14) random() Zufallszahl zwischen 0 und 1 round(v) Rundet v auf eine Ganzzahl round(v, s) Rundet v auf s Dezimalstellen sqrt(x) Quadratwurzel power(a, b) Potenzierung a hoch b (äquivalent mit a^b) sin(x), Trigonometrische Funktionen cos(x), tan(x), asin(x), etc. … Und viele mehr (siehe Doku von DBMS) 9
Zeichenketten Operatoren und Funktionen string || string Zeichenketten Verknüpfung Datenorientierte Systemanalyse – Analytische Auswertungen string || non-string Verknüpfung mit einem nicht String (‘value: ‘||3) lower(s) Konvertierung zu Kleinbuchstaben upper(s) Konvertierung zu Großbuchstaben initcap(s) Wandelt den ersten Buchstaben jedes Wortes in einen Großbuchstaben um length(s) Gibt die Anzahl der Zeichen des Strings aus trim(s) Entfernt Whitespace vom Beginn und Ende des Strings position(substring Lokation des spezifizierten Substrings in string) substring(string Substring von Position x für die nächsten y [from x] [for y]) Zeichen substring(string Substring mit Regex-Pattern from pattern) 10
Pattern Matching • string LIKE pattern bzw. string NOT LIKE pattern Datenorientierte Systemanalyse – Analytische Auswertungen Bei der Verwendung von LIKE gibt es die folgenden Wildcards: • % kein oder beliebig viele Zeichen • _ genau ein Zeichen • string [NOT] SIMILAR TO regex-pattern (seit SQL:1999) Das Regex Pattern ist nicht Posix konform. Hier wird wie beim LIKE das % für beliebige Zeichenketten und das _ für genau ein Zeichen verwendet. • Daneben bieten die meisten DBMS auch die Möglichkeit Posix- konforme Regular Expressions zu verwenden. z.B. in PostgreSQL mit dem ~ Operator 11
Build-in Scalar Functions Datenorientierte Systemanalyse – Analytische Auswertungen current_date gibt das aktuelle Datum zurück current_time gibt die aktuelle Zeit zurück current_timestamp gibt das aktuelle Datum inkl. Zeit zurück (äquivalent mit der Funktion now()) current_user gibt den Usernamen zurück, mit den man sich zur DB verbunden hat. 12
Formatierungs- bzw. Umwandlungsfunktionen • Um verschiedene Datentypen zu formatieren bzw. in bestimmte Datentypen umzuwandeln gibt es die „to_“ Funktionen. Datenorientierte Systemanalyse – Analytische Auswertungen to_char(timestamp, text) Konvertiert Timestamp zu String to_char(interval, text) Konvertiert Interval zu String to_char(numeric, text) Konvertiert Zahl (Double, real, numeric) zu String to_date(text, text) Konvertiert String zu Datentyp Date to_number(text, text) Konvertiert String zu Datentyp Numeric to_timestamp(text, text) Konvertiert String zu Datentyp Timestamp Der Aufruf der Funktionen ist immer gleich: • Der erste Parameter ist immer der Wert der formatiert werden soll. • Der zweite gibt das Muster des Inputs bzw. Outputs an. Normales Datentyp-Casting geht mit: CAST(expression AS type) 13
Ergebnisausgabe limitieren in PostgreSQL • Mit LIMIT und OFFSET kann man sich nur einer Teil des Result-Sets ausgeben lassen. Datenorientierte Systemanalyse – Analytische Auswertungen SELECT select_list FROM table_expression LIMIT number [OFFSET offset_num] Wird LIMIT number spezifiziert, werden maximal number Zeilen retourniert (nur weniger, wenn das Ergebnis weniger Resultate liefert). OFFSET gibt an, dass offset_num Zeilen übersprungen werden sollen, bevor mit der Ausgabe von Zeilen begonnen wird. OFFSET 0 ist gleichbedeutend mit dem Weglassen dieser Klausel. Wird LIMIT und OFFSET verwendet, werden zuerst offset_num Zeilen übersprungen, bevor mit der Rückgabe von number Zeilen begonnen wird. • Andere DBMS haben ähnliche Konstrukte um die Ergebnis- ausgabe zu limitieren. 14
Konditionale Ausdrücke • CASE: Datenorientierte Systemanalyse – Analytische Auswertungen vergleichbar mit if/else Blöcken in anderen Programmiersprachen: CASE WHEN condition THEN result [WHEN ...] [ELSE result] END 15
Konditionale Ausdrücke – CASE Beispiel SELECT * FROM test; a Datenorientierte Systemanalyse – Analytische Auswertungen --- 1 2 3 SELECT a, CASE WHEN a=1 THEN 'one' WHEN a=2 THEN 'two' ELSE 'other' END FROM test; a | case ---+------- 1 | one 2 | two 3 | other 16
Konditionale Ausdrücke • COALESCE: Datenorientierte Systemanalyse – Analytische Auswertungen COALESCE(value [, ...]) Die COALESCE Funktion gibt den ersten Wert zurück, der nicht null ist. SELECT COALESCE(description, short_description, '(none)'), … Ähnlich wie die Funktionen NVL und IFNULL bei anderen Datenbankmanagementsystemen. 17
Konditionale Ausdrücke • NULLIF: Datenorientierte Systemanalyse – Analytische Auswertungen NULLIF(value1, value2) Gibt NULL zurück wenn value1 gleich value2 ist. Ansonsten wird value1 zurückgegeben. Tipp: mit NULLIF(value, '') kann man erreichen, dass aus einer leeren Zeichenkette ein NULL Value wird. Zum Beispiel im Zusammenhang mit COALESCE da ansonsten, die leere Zeichenkette ausgegeben werden würde, da eine leere Zeichenkette ungleich NULL ist. Achtung: in Oracle ist alles anders. Dort gibt es keine leeren Zeichenketten werden automatisch NULL. 18
Aggregatsfunktionen Datenorientierte Systemanalyse – Analytische Auswertungen count(*) Anzahl der Input Rows count(expression) Anzahl der Input Werte, die ungleich NULL sind avg(expression) Durchschnitt (arithmetisches Mittel) über die Input Werte min(expression) Gibt den kleinsten Wert zurück max(expression) Gibt den größten Wert zurück sum(expression) Gibt die Summe der Input Werte zurück string_agg(expression, Input Werte werden zu einem String delimiter) zusammengehängt (Werte werden durch den delimiter getrennt) 19
Beispiel für string_agg() • Tipp: bei string_agg kann man auch ein ORDER BY Datenorientierte Systemanalyse – Analytische Auswertungen verwenden um die Werte zu sortieren. SELECT wohnort, count(*) as anzahl, string_agg(name, '; ' ORDER BY name) as namen FROM angestellte GROUP BY wohnort; 20
Statistische Aggregatsfunktionen in PostgreSQL Datenorientierte Systemanalyse – Analytische Auswertungen avg(X) Durchschnitt (arithmetisches Mittel) corr(Y, X) Korrelationskoeffizient zwischen X und Y var_pop(expression) Varianz aller Werte (Grundgesamtheit) var_samp(expression) Varianz aller Stichprobenwerte stddev_pop(expression) Standardabweichung aller Werte (Grundgesamtheit) stddev_samp(expres- Standardabweichung aller Werte der sion) Stichprobe regr_slope(Y, X) Steigung der Regressionsgeraden (lineare Regression) regr_intercept(Y, X) Intercept der Regressionsgeraden 21
Window Functions - Allgemeines • Mit SQL:2003 wurde die window clause eingeführt. Datenorientierte Systemanalyse – Analytische Auswertungen • Durch diese window clause werden aus Aggregate Functions Window Functions. • Von Oracle werden diese Funktionen als Analytic Functions bezeichnet. • Derzeit werden sie unter anderem von den folgenden Datenbankmanagementsystemen unterstützt: Keine Unterstützung in MySQL! 22
Window Functions - Funktionsweise • Window Funktionen führen eine Berechnung über Datenorientierte Systemanalyse – Analytische Auswertungen eine Menge von Zeilen durch, die auf irgendeine Weise verwandt mit der aktuellen Zeile sind. • Dies ist ähnlich wie bei Aggregatsfunktionen aber mit dem Unterschied, dass bei den Window Functions die Ergebnisse nicht in eine Zeile zusammengezogen werden – Die Zeilen bleiben erhalten. 23
Window Functions - Hinweise • Window Functions werden mit Ausnahme der ORDER BY clause zu allerletzt evaluiert. Wegen dieser späten Evaluierung Datenorientierte Systemanalyse – Analytische Auswertungen können sie deshalb nicht in der WHERE, GROUP BY oder HAVING Klausel vorkommen. • Zu beachten ist, dass die (Gruppe von) Zeilen, die für die Kalkulation herangezoggen werden, nicht durch eine GROUP BY clause bestimmt werden, sondern durch Partitioning innerhalb der Window clause. • Außerdem ist zu beachten, dass die Reihenfolge innerhalb der Gruppen durch eine ORDER BY clause bestimmt wird. Aber diese betrifft nur die Berechnung innerhalb der Window Function und hat keine Auswirkung auf die Reihenfolge, wie die Zeilen letztendlich ausgegeben werden. Tipp: Man kann der Spalte einen Alias Namen geben und dann diesen Aliasnamen zum sortieren des Ergebnisses verwenden.
SQL:2003 - Window Clause FUNCTION_NAME(expr) OVER {window_name|(window_specification)} Datenorientierte Systemanalyse – Analytische Auswertungen window_specification ::= [window_name][partitioning][ordering][framing] partitioning ::= PARTITION BY value [, value...] [COLLATE collation_name] ordering ::= ORDER [SIBLINGS] BY rule [, rule...] rule ::= {value|position|alias} [ASC|DESC] [NULLS {FIRST|LAST}] framing ::= {ROWS|RANGE} {start|between} [exclusion] start ::= {UNBOUNDED PRECEDING|unsigned-integer PRECEDING| CURRENT ROW} between ::= BETWEEN bound AND bound bound ::= {start|UNBOUNDED FOLLOWING|unsigned-integer FOLLOWING} exclusion ::= {EXCLUDE CURRENT ROW|EXCLUDE GROUP|EXCLUDE TIES|EXCLUDE NO OTHERS}
PostgreSQL - Window Clause FUNCTION_NAME(expr) OVER {window_name|(window_specification)} Datenorientierte Systemanalyse – Analytische Auswertungen window_specification ::= [partitioning][ordering][framing] partitioning ::= PARTITION BY value [, value...] ordering ::= ORDER BY rule [, rule...] rule ::= {value|position|alias} [ASC|DESC] [NULLS {FIRST|LAST}] framing ::= {ROWS|RANGE} {start|between} start ::= {UNBOUNDED PRECEDING|unsigned-integer PRECEDING| CURRENT ROW} between ::= BETWEEN bound AND bound bound ::= {start|UNBOUNDED FOLLOWING| unsigned-integer FOLLOWING} Die einfachste Form ist somit ein: function_name(expr) OVER () z.B. avg(salary) over()
Allgemeine Window Funktionen (1/2) Die folgenden Funktionen hängen von der Reihenfolge der Werte ab. Datenorientierte Systemanalyse – Analytische Auswertungen Deshalb ist hier zwingend ein ORDER BY im OVER() notwendig: row_number() Nummer der aktuellen Zeile innerhalb der Partition; zählen beginnt bei 1 rank() Rang der aktuellen Zeile (Es gibt Gaps wenn es gleiche Ergebnisse gibt) dense_rank() Rang der aktuellen Zeile ohne Gaps (peer groups) percent_rank() Relativer Rang der aktuellen Zeile: (rank-1)/(total rows-1) cume_dist() Relativer Rang der aktuellen Zeile: (number of rows preceding or peer with current row) / (total rows) ntile(num_buckets) Ganzzahl von 1 bis num_buckets, die die Partition so gleich wie möglich aufteilt. Nächste Folie 27
Allgemeine Window Funktionen (2/2) Datenorientierte Systemanalyse – Analytische Auswertungen lag(value [, offset Retourniert den Wert der Spalte value, der offset [, default]]) Zeilen weiter hinten kommt (offset defaults to 1; default ist standardmäßig NULL) lead(value [, offset Retourniert den Wert der Spalte value, der offset [, default]]) Zeilen weiter vorne steht (offset defaults to 1) first_value(value) Gibt den ersten Wert innerhalb eines Window- Frames zurück. last_value(value) Gibt letzten Wert innerhalb eines Window-Frames zurück. nth_value(value, nth) Gibt den nth-ten Wert innerhalb eines Window- Frames zurück. Zusätzlich zu diesen Funktionen kann jede Aggregatsfunktion als Window Function verwendet werden. Aggregatsfunktionen werden nur dann als Window Function interpretiert, wenn nach ihrem Aufruf ein OVER() folgt. 28
Window Functions - Beispiel Die folgende Tabelle ist der Ausgangspunkt für unsere weiteren Abfragen: Datenorientierte Systemanalyse – Analytische Auswertungen SELECT depname, empno, salary FROM empsalary; Depname=Abteilung Empno=Angestelltennr. Salary=Gehalt 29
Window Functions - Beispiel Geben Sie die Abteilungen mit dem jeweiligen Durchschnittsgehalt aus: Datenorientierte Systemanalyse – Analytische Auswertungen SELECT depname, avg(salary) FROM empsalary GROUP BY depname; • Soweit nichts neues: Hier wird AVG() als Aggregatsfunktion verwendet und nicht als Window Function. 30
Window Functions - Beispiel Nun sollten aber alle Personen mit ihren Gehalt und dem Durchschnitts- Datenorientierte Systemanalyse – Analytische Auswertungen gehalt der jeweiligen Abteilung ausgegeben werden: SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary; 31
Window Functions - Beispiel Lässt man das PARTITION BY weg, gibt es nur eine Partition (nämlich alle Datenorientierte Systemanalyse – Analytische Auswertungen Zeilen). Der Durchschnitt ist somit über alle Werte: SELECT depname, empno, salary, avg(salary) OVER () FROM empsalary; 32
Window Functions - Beispiel Mit rank() bekommt man den numerischen Rang innerhalb einer Partition, Datenorientierte Systemanalyse – Analytische Auswertungen der sich durch die Sortierung eines oder mehrerer Attribute ergibt. SELECT depname, empno, salary, rank() OVER (PARTITION BY depname ORDER BY salary DESC) FROM empsalary; 33
Window Functions - Beispiel Unterschied zwischen row_number(), rank() und dense_rank(): Datenorientierte Systemanalyse – Analytische Auswertungen SELECT depname, empno, salary, row_number() OVER (PARTITION BY depname ORDER BY salary DESC), rank() OVER (PARTITION BY depname ORDER BY salary DESC), dense_rank() OVER (PARTITION BY depname ORDER BY salary DESC) FROM empsalary; 34
Window Functions - Beispiel Damit man dasselbe Window nicht ständig wiederholen muss, kann man das Datenorientierte Systemanalyse – Analytische Auswertungen Window getrennt definieren und mit einen Namen versehen. SELECT depname, empno, salary, row_number() OVER w AS sort_attr, rank() OVER w, dense_rank() OVER w FROM empsalary WHERE 1=1 -- sinnlos, nur zum Zeigen, dass die Windowdef. danach kommt WINDOW w AS(PARTITION BY depname ORDER BY salary DESC) ORDER BY depname, sort_attr; 35
Window Functions – Window Frame • Es gibt noch ein anderes wichtiges Konzept bei den Window Datenorientierte Systemanalyse – Analytische Auswertungen Functions. Nämlich für jede Zeile gibt es innerhalb der Partition eine Menge von Zeilen, die als Window Frame bezeichnet werden. Viele (aber nicht alle) Window Functions beziehen in ihren Berechnungen nur die Zeilen des Window Frames ein und nicht alle Zeilen der Partition. • Standardmäßig, wenn ein ORDER BY spezifiziert ist, besteht der Frame aus allen Zeilen vom Start der Partition bis zur aktuellen Zeile plus alle folgenen Zeilen, die den selben Wert wie die aktuelle Zeile haben. • Wird ORDER BY weggelassen, besteht der Frame standardmäßig aus allen Zeilen der Partition. • Das Beispiel auf der nächsten Folie dient zur Veranschaulichung dieses Standardverhaltens. 36
Window Functions – Window Frame SELECT salary, sum(salary) OVER SELECT salary, sum(salary) OVER () FROM empsalary; (ORDER BY salary) Datenorientierte Systemanalyse – Analytische Auswertungen FROM empsalary; Beide 4800 Werte sind hier schon dabei Ohne ORDER BY besteht der Mit ORDER BY besteht der Frame aus allen Zeilen der Frame aus allen Zeilen bis zur Partition. aktuellen (gemäß Sortierung). 37
Weiterführende Literatur • SQL in a Nutshell, 2nd edition Datenorientierte Systemanalyse – Analytische Auswertungen http://sqlnut.atw.hu/ • PostgreSQL - Window Functions http://www.postgresql.org/docs/9.2/static/functions-window.html • PostgreSQL - Window Functions Tutorial http://www.postgresql.org/docs/9.2/static/tutorial-window.html • PostgreSQL – Syntax Window Functions http://www.postgresql.org/docs/9.2/static/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS • Oracle - Analytic Functions http://www.oracle-base.com/articles/misc/analytic-functions.php 38
ENDE Datenorientierte Systemanalyse – Analytische Auswertungen 39
Sie können auch lesen