====Oracle Analytic Functions im praktischen Einsatz===== Eine Einführung zum Thema steht hier: \\ http://www.pipperr.de/knowhow/ana_function/analytic_functions.html Eine ANA Funktion wird auf der Ergebnis Menge durchgeführt: {{:prog:ana:oracle_analytical_function_v01.png?400|Oracle ANA Grundlagen}} ---- ==== Beispiel 1 - Lücken in einem Datenstrom finden ==== Vorgänger/Nachfolger finden * Lag() * Lead() z.B. * Unterschied zwischen zwei Bereichen/Quartalen * Lücken in Daten finden In einer Tabelle soll eine normalerweise fortlaufende Nummer auf Lücken geprüft werden: * [[prog:oracle_analytic_functions_lag|Beispiel 1 - Lücken in einem Datenstrom finden]] ---- ==== Beispiel 2 - Top N Query ==== Ranking Funktionen: * rank() * dense_rank() * row_number() * cume_dist() * percent_rank() * Ntile() Mit der rank() Funktion kann dem Ergebnis einer Abfrage ein Rang pro Ergebnis zu geordnet werden. * [[prog:oracle_analytic_functions_top_n|Beispiel 2 - Top N Query ]] ---- ==== Beispiel 3 - Doppelte Daten finden ==== Mit Hilfe der row_number() Funktion doppelte Daten identifizieren * [[prog:oracle_analytic_functions_doubletten|Beispiel 3 - Doppelte Daten finden]] ---- ==== Beispiel 4 - Prozentangabe der Anteile einer Liste ausgeben ==== Mit Hilfe der ratio_to_report() kann der Prozentuale Anteil an der Ergebnismenge angezeigt werden. * [[prog:oracle_analytic_functions_prozent|Beispiel 4 -Prozentsatz anzeigen]] ---- ==== Beispiel 5 - gleitende Summen berechnen bzw. kumulative Werte aufsummieren - Fensterfunktion verwenden ==== Mit Hilfe einer Fensterfunktion soll zum Beispiel die Summe der letzen drei jeweiligen Monate errechnet werden. * [[prog:oracle_analytic_functions_window_function|Beispiel 5 -"gleitende" Summen berechnen]] ---- ==== Beispiel 6 - Ein Listen von Werten in SQL erstellen ==== Aufgabe: Ein separierte Liste soll aus den Werten einer SQL Abfrage erstellt werden. Vor 11g => siehe [[prog:sql_aggregatfunktion_erstellen|Eine eigene Aggregat Funktion für eine group by Abfrage erstellen]] Lösung mit listagg: SQL>SELECT deptno , listagg(ename,':') WITHIN GROUP (ORDER BY ename) AS emp_list FROM emp GROUP BY deptno / DEPTNO EMP_LIST ---------- --------------------------------- 10 CLARK:KING:MILLER 20 ADAMS:JONES 30 ALLEN:MARTIN:TURNER:WARD Mit listagg kann eine Liste bis maximal 4000 Zeichen aggregiert werden. Quelle, siehe http://docs.oracle.com/cd/E11882_01/server.112/e10592/functions089.htm und http://www.oracle-developer.net/display.php?id=515 ---- ===== Weitere Informationen im Netz ===== **Oracle** **12c** * http://www.oracle.com/technetwork/database/bi-datawarehousing/wp-in-database-analytics-12c-2132656.pdf