====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