In einer Datenbank von Transaktionen, die über 1.000 von Entitäten über 18 Monate reisen, möchte ich eine Abfrage ausführen, um jede mögliche 30-Tage-Periode durch Entityid mit einer SUM ihrer Transaktionsbeträge und COUNT ihrer Transaktionen in diesem 30-Tage-Zeitraum zu gruppieren, Und die Daten so zurücksenden, dass ich mich dann abfragen kann. Nach einer Menge von Tests, dieser Code vollbringt viel von dem, was ich will: Und ich werde in einer größeren Abfrage strukturiert etwas wie: Der Fall, dass diese Abfrage nicht decken ist, wenn die Transaktion zählt würde überspannen mehrere Monate, aber immer noch innerhalb von 30 Tagen von einander. Ist diese Art von Abfrage möglich mit Postgres Wenn ja, ich begrüße jede Eingabe. Viele der anderen Themen diskutieren laufende Aggregate, nicht rollen. Das CREATE TABLE-Skript: Ideale Ausgabe würde SUM (Betrag) und COUNT () aller Transaktionen über einen rollierenden 30-Tage-Zeitraum beinhalten. Sehen Sie dieses Bild, zum Beispiel: Die grüne Datumshighlighting zeigt an, was in meiner Abfrage enthalten ist. Die gelbe Zeilen-Hervorhebung zeigt Datensätze an, was ich möchte, um Teil des Satzes zu werden. Bei jedem möglichen 30-tägigen Zeitraum von entityid meint ihr, dass die Periode jeden Tag beginnen kann, also 365 mögliche Perioden in einem (Nicht-Sprung) Jahr Oder möchten Sie nur Tage mit einer tatsächlichen Transaktion als Beginn einer Periode einzeln für jeden betrachten Entityid So oder so, bitte geben Sie Ihre Tabellendefinition, Postgres Version, einige Beispieldaten und das erwartete Ergebnis für die Probe an. Ndash Erwin Brandstetter Jul 20 15 um 7:18 In der Theorie meinte ich jeden Tag, aber in der Praxis gibt es keine Notwendigkeit, Tage zu betrachten, wo es keine Transaktionen gibt. I39ve hat die Beispieldaten und die Tabellendefinition veröffentlicht. Ndash tufelkinder Du möchtest Zeilen der gleichen Entityid in einem 30-Tage-Fenster anfangen, beginnend bei jeder tatsächlichen Transaktion. Kann es mehrere Transaktionen für die gleiche (transdate, entityid) oder ist diese Kombination definiert eindeutig Ihre Tabellendefinition hat keine UNIQUE oder PK Einschränkung, aber Einschränkungen scheinen zu fehlen. Ndash Erwin Brandstetter Die Abfrage, die du hast Du könntest deine Abfrage mit einer WINDOW-Klausel vereinfachen, aber das ist nur die Syntax zu verkürzen und den Abfrageplan nicht zu ändern. Auch mit dem etwas schnelleren count (). Da id ist definitiv definiert NICHT NULL Und du brauchst nicht zu binden BY entityid da du bereits PARTITION BY entityid Du kannst weiter vereinfachen, aber: Füge nicht ORDER BY zur Fensterdefinition überhaupt hinzu, es ist nicht relevant für deine Abfrage. Dann müssen Sie nicht einen benutzerdefinierten Fensterrahmen definieren, entweder: Einfacher, schneller, aber immer noch eine bessere Version von dem, was Sie haben. Mit statischen Monaten. Die Abfrage, die Sie vielleicht wünschen, ist nicht klar definiert, also krank auf diese Annahmen: Zählen Sie Transaktionen und Betrag für jede 30-Tage-Periode innerhalb der ersten und letzten Transaktion einer Entityid. Ausschluss von führenden und nachlaufenden Perioden ohne Aktivität, aber alle möglichen 30-Tage-Perioden innerhalb dieser äußeren Grenzen. Hier werden alle 30-Tage-Perioden für jede Entityid mit Ihren Aggregaten aufgelistet und mit dem Transptieren der erste Tag (inkl.) Des Zeitraums. Um Werte für jede einzelne Zeile zu erhalten, verbinden Sie die Basistabelle noch einmal. Die grundlegende Schwierigkeit ist die gleiche wie hier diskutiert: Die Rahmendefinition eines Fensters kann nicht von Werten der aktuellen Zeile abhängen. Die Abfrage, die Sie eigentlich wollen Nach Frage Update und Diskussion: Sammeln Sie Zeilen der gleichen Entityid in einem 30-Tage-Fenster beginnend bei jeder tatsächlichen Transaktion. Da Ihre Daten spärlich verteilt sind, sollte es effizienter sein, eine Selbstverknüpfung mit einer Bereichsbedingung zu führen. Um so mehr, da Postgres 9.1 keine LATERAL-Joins hat, doch: Ein Rollfenster konnte nur für die meisten Tage Sinn machen (in Bezug auf Leistung) mit Daten. Dies vereinfacht Duplikate nicht auf (transdate, entityid) pro Tag, aber alle Zeilen des gleichen Tages sind immer im 30-Tage-Fenster enthalten. Für einen großen Tisch kann ein Deckungsindex wie dies ziemlich viel helfen: Der letzte Spaltenbetrag ist nur dann sinnvoll, wenn man nur Index-Scans bekommt. Else fallen auf. Aber es wird nicht benutzt, während du den ganzen Tisch sowieso auswählst. Es würde Abfragen für eine kleine Untermenge unterstützen.22 SQL für Analyse und Reporting Oracle hat erweiterte SQL-analytische Verarbeitungsfunktionen durch die Einführung einer neuen Familie von analytischen SQL-Funktionen. Diese analytischen Funktionen ermöglichen es Ihnen, zu berechnen: Ranglisten und Perzentile Verschieben von Fensterberechnungen Lineare Regressionsstatistiken Rangierungsfunktionen umfassen kumulative Verteilungen, Prozentrang und N-Fliesen. Bewegliche Fensterberechnungen erlauben es Ihnen, bewegliche und kumulative Aggregationen wie Summen und Durchschnittswerte zu finden. Die Laglead-Analyse ermöglicht direkte Zwischenreferenzen, so dass Sie Periodenperiodenänderungen berechnen können. Die erste Analyse ermöglicht es Ihnen, den ersten oder letzten Wert in einer geordneten Gruppe zu finden. Andere Verbesserungen für SQL beinhalten den CASE-Ausdruck und die partitionierte äußere Verknüpfung. CASE-Ausdrücke liefern if-then Logik in vielen Situationen nützlich. Partitionierte äußere Verknüpfung ist eine Erweiterung der ANSI-äußeren Join-Syntax, die es Benutzern ermöglicht, bestimmte Dimensionen selektiv zu verdichten, während andere andere spärlich bleiben. Dies ermöglicht es den Berichterstellungswerkzeugen, die Dimensionen selektiv zu verdichten, z. B. diejenigen, die in ihren tabellarischen Berichten erscheinen, während sie andere spärlich halten. Um die Performance zu steigern, können analytische Funktionen parallelisiert werden: Mehrere Prozesse können gleichzeitig alle diese Anweisungen ausführen. Diese Fähigkeiten machen Berechnungen einfacher und effizienter und verbessern so die Datenbankleistung, Skalierbarkeit und Einfachheit. Analytische Funktionen werden wie in Tabelle 22-1 beschrieben klassifiziert. Tabelle 22-1 Analytische Funktionen und ihre Verwendung Um diese Operationen durchzuführen, fügen die analytischen Funktionen mehrere neue Elemente der SQL-Verarbeitung hinzu. Diese Elemente bauen auf vorhandenem SQL auf, um flexible und leistungsfähige Berechnungsausdrücke zu ermöglichen. Mit wenigen Ausnahmen haben die analytischen Funktionen diese neuen Elemente. Der Verarbeitungsablauf ist in Abbildung 22-1 dargestellt. Abbildung 22-1 Verarbeitungsauftrag Die wesentlichen Konzepte, die in analytischen Funktionen verwendet werden, sind: Die Abfrageverarbeitung mit Hilfe von analytischen Funktionen erfolgt in drei Stufen. Erstens, alle schließt sich an, wo. GROUP BY und HAVING-Klauseln werden durchgeführt. Zweitens wird die Ergebnismenge den analytischen Funktionen zur Verfügung gestellt, und alle ihre Berechnungen finden statt. Drittens, wenn die Abfrage eine ORDER BY-Klausel an ihrem Ende hat, wird die ORDER BY verarbeitet, um eine präzise Ausgabe zu bestellen. Die Bearbeitungsreihenfolge ist in Abbildung 22-1 dargestellt. Ergebnis-Set-Partitionen Die analytischen Funktionen erlauben es Benutzern, Abfrage-Ergebnis-Sets in Gruppen von Zeilen aufzuteilen, die als Partitionen bezeichnet werden. Beachten Sie, dass der Begriff der Partitionen, die mit analytischen Funktionen verwendet werden, nicht mit der Funktion der Tabellenpartitionen verwandt ist. In diesem Kapitel bezieht sich der Begriff Partitionen nur auf die Bedeutung von analytischen Funktionen. Partitionen werden nach den mit GROUP BY-Klauseln definierten Gruppen erstellt, so dass sie für alle aggregierten Ergebnisse wie Summen und Mittelwerte verfügbar sind. Partitionsdivisionen können auf beliebigen Spalten oder Ausdrücken basieren. Ein Abfrageergebnissatz kann in nur eine Partition aufgeteilt werden, die alle Zeilen, einige große Partitionen oder viele kleine Partitionen mit nur wenigen Zeilen hält. Für jede Zeile in einer Partition können Sie ein Schiebefenster von Daten definieren. Dieses Fenster bestimmt den Bereich der Zeilen, mit denen die Berechnungen für die aktuelle Zeile durchgeführt werden. Fenstergrößen können entweder auf einer physischen Anzahl von Zeilen oder einem logischen Intervall wie z. B. Zeit basieren. Das Fenster hat eine Startreihe und eine Endreihe. Je nach Definition kann sich das Fenster an einem oder beiden Enden bewegen. Zum Beispiel würde ein Fenster, das für eine kumulative Summenfunktion definiert ist, seine Anfangsreihe an der ersten Zeile seiner Partition festlegen, und seine Endzeile würde vom Startpunkt bis zur letzten Zeile der Partition gleiten. Im Gegensatz dazu würde ein Fenster, das für einen gleitenden Durchschnitt definiert ist, sowohl seine Anfangs - als auch die Endpunkte verschieben, so dass sie einen konstanten physischen oder logischen Bereich beibehalten. Ein Fenster kann so groß wie alle Zeilen in einer Partition oder nur ein Schiebefenster einer Zeile innerhalb einer Partition gesetzt werden. Wenn ein Fenster in der Nähe eines Rahmens ist, gibt die Funktion die Ergebnisse nur für die verfügbaren Zeilen zurück, anstatt Sie zu warnen, dass die Ergebnisse nicht das sind, was Sie wollen. Bei der Verwendung von Fensterfunktionen ist die aktuelle Zeile bei Berechnungen enthalten, also sollten Sie nur (n -1) angeben, wenn Sie mit n Items umgehen. Jede Berechnung, die mit einer analytischen Funktion durchgeführt wird, basiert auf einer aktuellen Zeile innerhalb einer Partition. Die aktuelle Zeile dient als Referenzpunkt, der den Anfang und das Ende des Fensters bestimmt. Beispielsweise könnte eine zentrierte gleitende Durchschnittsberechnung mit einem Fenster definiert werden, das die aktuelle Zeile, die sechs vorhergehenden Zeilen und die folgenden sechs Zeilen enthält. Dies würde ein Schiebefenster von 13 Reihen erzeugen, wie in Abbildung 22-2 gezeigt. Abbildung 22-2 Schiebefenster Beispiel-Ranking-, Window - und Reporting-Funktionen In diesem Abschnitt werden die grundlegenden analytischen Funktionen für Ranking, Fenster und Reporting dargestellt. Beispiel-lineare Regressionsberechnung In diesem Beispiel berechnen wir eine gewöhnlich-kleinste Quadrate-Regressionsgerade, die die verkaufte Menge eines Produkts als lineare Funktion des Produktlistenpreises ausdrückt. Die Berechnungen werden nach dem Vertriebskanal gruppiert. Die Werte SLOPE. INTCPT. RSQR sind Steilheit, Abfangen und Bestimmungskoeffizient der Regressionsgerade. Der (ganzzahlige) Wert COUNT ist die Anzahl der Produkte in jedem Kanal, für die beide Mengen verkauft und Listenpreisdaten verfügbar sind. Statistische Aggregate Oracle bietet eine Reihe von SQL-statistischen Funktionen und ein Statistikpaket, DBMSSTATFUNCS. In diesem Abschnitt werden einige der neuen Funktionen mit der Grundsyntax aufgelistet. Beschreibende Statistik Sie können die folgenden beschreibenden Statistiken berechnen: Median eines Datensatzmodus eines Datensatzes Sie können die folgenden parametrischen Statistiken berechnen: Spearmans rho Koeffizient Kendalls tau-b Koeffizient Zusätzlich zu den Funktionen verfügt dieses Release über ein PLSQL Paket, DBMSSTATFUNCS . Es enthält die beschreibende statistische Funktion ZUSAMMENFASSUNG zusammen mit Funktionen zur Unterstützung der Verteilungsmontage. Die ZUSAMMENFASSUNG-Funktion fasst eine numerische Spalte einer Tabelle mit einer Vielzahl von deskriptiven Statistiken zusammen. Die fünf Verteilungsanpassungsfunktionen unterstützen normale, einheitliche, Weibull-, Poisson - und Exponentialverteilungen. Benutzerdefinierte Aggregate Oracle bietet eine Möglichkeit zur Erstellung eigener Funktionen, sogenannte benutzerdefinierte Aggregatfunktionen. Diese Funktionen werden in Programmiersprachen wie PLSQL, Java und C geschrieben und können als analytische Funktionen oder Aggregate in materialisierten Sichten verwendet werden. Weitere Informationen zur Syntax und Einschränkungen finden Sie im Oracle Database Data Cartridge Developers Guide. Die Vorteile dieser Funktionen sind: Hochkomplexe Funktionen können mit einer vollautomatischen Sprache programmiert werden. Höhere Skalierbarkeit als andere Techniken, wenn benutzerdefinierte Funktionen für die Parallelverarbeitung programmiert sind. Objektdatentypen können verarbeitet werden. Als einfaches Beispiel für eine benutzerdefinierte Aggregatfunktion betrachten wir die Skew-Statistik. Diese Berechnung misst, wenn ein Datensatz eine schiefe Verteilung über seinen Mittelwert hat. Es wird Ihnen sagen, wenn ein Schwanz der Verteilung ist deutlich größer als die anderen. Wenn Sie ein benutzerdefiniertes Aggregat namens udskew erstellt und es auf die Kreditlimitdaten im vorherigen Beispiel angewendet haben, können die SQL-Anweisung und die Ergebnisse wie folgt aussehen: Vor dem Erstellen von benutzerdefinierten Aggregatfunktionen sollten Sie berücksichtigen, ob Ihre Anforderungen erfüllt werden können Im regulären SQL. Viele komplexe Berechnungen sind direkt in SQL möglich, insbesondere durch den CASE-Ausdruck. Der Aufenthalt mit regelmäßigem SQL ermöglicht eine einfachere Entwicklung, und viele Abfrageoperationen sind bereits in SQL gut parallelisiert. Auch das frühere Beispiel, die Skew-Statistik, kann mit Standard, wenn auch langwierig, SQL erstellt werden. Pivoting Operations Die von Business Intelligence-Abfragen zurückgesandte D ata ist oftmals am meisten nutzbar, wenn sie in einem Crosstabular-Format dargestellt wird. Die Pivot-Klausel der SELECT-Anweisung ermöglicht es Ihnen, Kreuztabellenabfragen zu schreiben, die Zeilen in Spalten drehen und Daten im Prozess der Rotation aggregieren. Pivoting ist eine Schlüsseltechnik in Data Warehouses. In ihr verwandeln Sie mehrere Zeilen von Input in weniger und allgemein breitere Zeilen im Data Warehouse. Beim Schwenken wird ein Aggregationsoperator für jedes Element in der Pivot-Spaltenwertliste angewendet. Die Pivot-Spalte kann keinen beliebigen Ausdruck enthalten. Wenn du einen Ausdruck pflegen musst, dann solltest du den Ausdruck in einer Ansicht vor dem PIVOT-Vorgang ausrichten. Die Grundsyntax lautet wie folgt: Um die Verwendung von Schwenkungen zu veranschaulichen, erstellen Sie die folgende Ansicht als Grundlage für spätere Beispiele: Beispiel: Pivoting Die folgende Anweisung veranschaulicht einen typischen Pivot auf der Kanalspalte: Beachten Sie, dass die Ausgabe vier neue Aliased-Spalten erstellt hat , DIREKTVERTRIEB. INTERNETSALES. KATALOGSALE. Und TELESALES. Eine für jeden der Pivot-Werte. Die Ausgabe ist eine Summe. Wenn kein Alias vorhanden ist, sind die Spaltenüberschrift die Werte der IN-Liste. Schwenken auf mehrere Spalten Sie können sich auf mehr als einer Spalte drehen. Die folgende Anweisung veranschaulicht einen typischen Mehrfachspalten-Pivot: Beachten Sie, dass in diesem Beispiel eine mehrspaltige IN-Liste mit Spaltenüberschriften angegeben ist, die für die Mitglieder der IN-Liste geeignet sind. Pivoting: Mehrere Aggregate Sie können mit mehreren Aggregaten schwenken, wie im folgenden Beispiel gezeigt: Beachten Sie, dass die Abfrage Spaltenüberschriften durch Verknüpfen der Pivotwerte (oder Alias) mit dem Alias der Aggregatfunktion plus einem Unterstrich erstellt. Unterscheidung von PIVOT-generierten Nulls von Nulls in Quelldaten Sie können zwischen Nullwerten unterscheiden, die aus der Verwendung von PIVOT und denen, die in den Quelldaten vorhanden sind, erzeugt werden. Das folgende Beispiel veranschaulicht Nullen, die PIVOT erzeugt. Die folgende Abfrage gibt Zeilen mit 5 Spalten zurück, Spalte prodid. Und die daraus resultierenden Säulen Q1 schwenken. Q1COUNTTOTAL Q2 Q2COUNTTOTAL Für jeden eindeutigen Wert von prodid. Q1COUNTTOTAL gibt die Gesamtzahl der Zeilen zurück, deren qtr-Wert Q1 ist. Das heißt, und Q2COUNTTOTAL gibt die Gesamtzahl der Zeilen zurück, deren qtr-Wert Q2 ist. Angenommen, wir haben eine Tabelle sales2 der folgenden Struktur: Aus dem Ergebnis wissen wir, dass für prodid 100 gibt es 2 Verkaufszeilen für Quartal Q1. Und 1 Verkaufsreihe für Quartal Q2 für prodid 200, gibt es 1 Verkaufsreihe für Viertel Q1. Und keine Verkaufsreihe für Quartal Q2. Also, in Q2COUNTTOTAL. Sie können feststellen, dass NULLlt1gt aus einer Zeile in der ursprünglichen Tabelle kommt, deren Maßnahme von Nullwert ist, während NULLlt2gt darauf zurückzuführen ist, dass keine Zeile in der ursprünglichen Tabelle für prodid 200 im Quartal Q2 vorhanden ist. Unpivoting Operations Ein Unpivot gibt einen PIVOT-Vorgang nicht um. Stattdessen dreht es Daten von Spalten in Zeilen. Wenn Sie mit geschwenkten Daten arbeiten, kann ein UNPIVOT-Vorgang keine Aggregationen rückgängig machen, die von PIVOT oder anderen Mitteln gemacht wurden. Zur Veranschaulichung von Unpiving erstellen Sie zunächst eine geschwenkte Tabelle mit vier Spalten für Quartale des Jahres: Die Tabelleninhalte ähneln wie folgt: Die folgende UNPIVOT-Operation dreht die Viertelspalten in Zeilen. Für jedes Produkt gibt es vier Reihen, eine für jedes Quartal. Beachten Sie die Verwendung von INCLUDE NULLS in diesem Beispiel. Sie können auch EXCLUDE NULLS verwenden. Die Standardeinstellung ist. Darüber hinaus können Sie auch mit zwei Spalten unpivotieren, wie im Folgenden: Wildcard und Subquery Pivoting mit XML Operations Wenn Sie ein Wildcard-Argument oder eine Unterabfrage in Ihren schwenkbaren Spalten verwenden möchten, können Sie dies mit der PIVOT XML-Syntax tun. Mit PIVOT XML ist die Ausgabe der Operation korrekt formatiert XML. Das folgende Beispiel veranschaulicht die Verwendung des Platzhalter-Schlüsselwortes, JEDES. Es gibt XML aus, das alle Kanalwerte in der Verkaufsansicht enthält: Beachten Sie, dass das Schlüsselwort ANY in PIVOT-Operationen nur als Teil eines XML-Vorgangs verfügbar ist. Diese Ausgabe enthält Daten für Fälle, in denen der Kanal im Datensatz existiert. Beachten Sie auch, dass Aggregationsfunktionen eine GROUP BY-Klausel angeben müssen, um mehrere Werte zurückzugeben, aber die Pivotclaus enthält keine explizite GROUP BY-Klausel. Stattdessen führt die Pivotklausel eine implizite GROUP BY durch. Das folgende Beispiel veranschaulicht die Verwendung einer Unterabfrage. Es gibt XML aus, das alle Kanalwerte und die Verkaufsdaten enthält, die jedem Kanal entsprechen: Die Ausgabe verdichtet die Daten, um alle möglichen Kanäle für jedes Produkt einzuschließen. Data Densification for Reporting Daten werden normalerweise in spärlicher Form gespeichert. Das heißt, wenn kein Wert für eine gegebene Kombination von Dimensionswerten existiert, existiert keine Zeile in der Faktentabelle. Allerdings können Sie die Daten in dichtes Formular anzeigen, wobei Zeilen für alle Kombination von Bemaßungswerten angezeigt werden, auch wenn keine Tatsachenangaben für sie vorhanden sind. Zum Beispiel, wenn ein Produkt nicht verkauft während eines bestimmten Zeitraums, können Sie immer noch wollen, um das Produkt für diesen Zeitraum mit Null Verkaufswert neben ihm zu sehen. Darüber hinaus können Zeitreihenberechnungen am einfachsten durchgeführt werden, wenn Daten entlang der Zeitdimension dicht sind. Dies ist, weil dichte Daten eine konsistente Anzahl von Zeilen für jede Periode füllen, was wiederum macht es einfach, die analytischen Fensterfunktionen mit physischen Offsets zu verwenden. Datenverdichtung ist der Prozess der Umwandlung von spärlichen Daten in dichte Form. Um das Problem der Spärlichkeit zu überwinden, können Sie eine partitionierte äußere Verknüpfung verwenden, um die Lücken in einer Zeitreihe oder einer anderen Dimension zu füllen. Eine solche Verknüpfung erweitert die herkömmliche äußere Verknüpfungssyntax durch Anwenden der äußeren Verknüpfung auf jede logische Partition, die in einer Abfrage definiert ist. Oracle partitioniert die Zeilen in Ihrer Abfrage logisch, basierend auf dem Ausdruck, den Sie in der PARTITION BY-Klausel angeben. Das Ergebnis einer partitionierten äußeren Verknüpfung ist eine UNION der äußeren Joins jeder der Partitionen in der logisch partitionierten Tabelle mit dem Tisch auf der anderen Seite der Verknüpfung. Beachten Sie, dass Sie diese Art von Join verwenden können, um die Lücken in jeder Dimension zu füllen, nicht nur die Zeitdimension. Die meisten Beispiele hier konzentrieren sich auf die Zeitdimension, da es die am häufigsten als Vergleichsgrundlage verwendete Dimension ist. Partition Join Syntax Die Syntax für partitionierte äußere Verknüpfung erweitert die ANSI SQL JOIN-Klausel mit dem Ausdruck PARTITION BY gefolgt von einer Ausdrucksliste. Die Ausdrücke in der Liste geben die Gruppe an, auf die die äußere Verknüpfung angewendet wird. Im Folgenden sind die beiden Syntaxformen, die normalerweise für die partitionierte äußere Verknüpfung verwendet werden: Beachten Sie, dass FULL OUTER JOIN nicht mit einem partitionierten äußeren Join unterstützt wird. Stichprobe von Sparse-Daten Eine typische Situation mit einer spärlichen Dimension zeigt sich im folgenden Beispiel, das die wöchentlichen Verkäufe und den Jahresabschluss für das Produkt Bounce für die Wochen 20-30 in den Jahren 2000 und 2001 berechnet. In diesem Beispiel werden wir Würde erwarten, dass zwei Datenreihen (11 Wochen jeweils ab 2 Jahren), wenn die Daten dicht waren. Allerdings bekommen wir nur 18 Reihen, weil die Wochen 25 und 26 im Jahr 2000 und die Wochen 26 und 28 im Jahr 2001 fehlen. Füllen Lücken in Daten Wir können die spärlichen Daten der vorherigen Abfrage nehmen und eine partitionierte äußere Verknüpfung mit einem dichten Satz von machen Zeitdaten. In der folgenden Abfrage alias unsere ursprüngliche Abfrage als v und wir wählen Daten aus der Zeittabelle, die wir alias als t. Hier holen wir 22 Reihen, weil es keine Lücken in der Serie gibt. Die vier hinzugefügten Zeilen haben jeweils 0, da ihr Verkaufswert mit der NVL-Funktion auf 0 gesetzt ist. Beachten Sie, dass in dieser Abfrage eine WHERE-Bedingung für Wochen zwischen 20 und 30 in der Inline-Ansicht für die Zeitdimension platziert wurde. Dies wurde eingeführt, um das Ergebnis klein zu halten. Füllen von Lücken in zwei Dimensionen N-dimensionale Daten werden typischerweise als dichte zweidimensionale Querlasche von (n - 2) Seitenabmessungen angezeigt. Dies erfordert, dass alle Dimensionswerte für die beiden Dimensionen, die in der Kreuztafel erscheinen, ausgefüllt werden. Das folgende ist ein anderes Beispiel, bei dem die partitionierte äußere Verknüpfungsfähigkeit verwendet werden kann, um die Lücken auf zwei Dimensionen zu füllen: In dieser Abfrage ist die WITH subquery factoring-Klausel V1 fasst die Verkaufsdaten auf Produkt-, Länder - und Jahresebene zusammen. Dieses Ergebnis ist spärlich, aber Benutzer können das ganze Land sehen, Jahrkombinationen für jedes Produkt. Um dies zu erreichen, nehmen wir jede Teilung von v1 auf der Grundlage von Produktwerten und äußere verbinden sie auf der Land Dimension zuerst. Dies gibt uns alle Werte des Landes für jedes Produkt. Wir nehmen dann dieses Ergebnis und verteilen es auf Produkt - und Länderwerte und dann äußere verbinden es auf Zeitdimension. Dies gibt uns alle Zeitwerte für jede Produkt - und Länderkombination. Füllen von Lücken in einer Inventory-Tabelle Eine Inventar-Tabelle in der Regel Spuren der Menge der Einheiten für verschiedene Produkte. Diese Tabelle ist spärlich: Es speichert nur eine Zeile für ein Produkt, wenn es ein Ereignis gibt. Für eine Verkaufstabelle ist die Veranstaltung ein Verkauf, und für die Inventar-Tabelle ist die Veranstaltung eine Mengenänderung für ein Produkt. Betrachten wir zum Beispiel die folgende Inventartabelle: Die Inventartabelle hat nun die folgenden Zeilen: Für Berichtszwecke können Benutzer diese Bestandsdaten unterschiedlich sehen. Zum Beispiel können sie alle Werte für jedes Produkt sehen. Dies kann durch partitionierte äußere Verknüpfung erreicht werden. Darüber hinaus können die Benutzer für die neu eingefügten Zeilen fehlender Zeitperioden die Werte für die Menge der Spalte, die von der letzten vorhandenen Zeitspanne übertragen werden sollen, sehen. Letzteres kann mit Hilfe der analytischen Fensterfunktion LASTVALUE-Wert erreicht werden. Hier ist die Abfrage und die gewünschte Ausgabe: Die innere Abfrage berechnet eine partitionierte äußere Verknüpfung pünktlich innerhalb jedes Produktes. Die innere Abfrage verdichtet die Daten über die Zeitdimension (dh die Zeitdimension hat nun eine Zeile für jeden Wochentag). Allerdings hat die Maßspaltenmenge Nullwerte für die neu hinzugefügten Zeilen (siehe die Ausgabe in der Spaltenmenge in den folgenden Ergebnissen: Die äußere Abfrage verwendet die analytische Funktion LASTVALUE. Bei Anwendung dieser Funktion werden die Daten nach Produkt partitioniert und die Daten auf der Zeitdimensionssäule (timeid) Für jede Zeile findet die Funktion den letzten Nicht-Nullwert im Fenster aufgrund der Option IGNORE NULLS, die Sie sowohl mit LASTVALUE als auch mit FIRSTVALUE verwenden können. Wir sehen die gewünschte Ausgabe in der Spalte wiederholt Die folgende Ausgabe: Berechnen von Datenwerten zum Füllen von Lücken Beispiele im vorherigen Abschnitt veranschaulichen, wie man partitionierte äußere Verknüpfung verwendet, um Lücken in einer oder mehreren Dimensionen zu füllen. Allerdings haben die Ergebnismengen, die durch partitionierte äußere Verknüpfung erzeugt werden, Nullwerte für Spalten, die nicht enthalten sind Die PARTITION BY-Liste ist typischerweise Maßstabsspalten Benutzer können von analytischen SQL-Funktionen Gebrauch machen, um diese Nullwerte durch einen Nicht-Nullwert zu ersetzen. Beispielsweise berechnet die folgende Abfrage monatliche Summen für Produkte 64MB Speicherkarte und DVD-R Discs (Produkt-IDs 122 und 136) für das Jahr 2000. Es verwendet partitionierte äußere Verknüpfung, um Daten für alle Monate zu verdichten. Für die fehlenden Monate verwendet es dann die analytische SQL-Funktion AVG, um die Verkäufe und Einheiten zu berechnen, um der Durchschnitt der Monate zu sein, in denen das Produkt verkauft wurde. Wenn Sie in SQLPlus arbeiten, werden die folgenden beiden Befehle die Spaltenüberschriften für eine bessere Lesbarkeit der Ergebnisse umbrochen: Zeitreihenberechnungen auf Densified Data Densificatio n ist nicht nur für die Berichterstattung Zweck. Es ermöglicht auch bestimmte Arten von Berechnungen, insbesondere Zeitreihenberechnungen. Zeitreihenberechnungen sind einfacher, wenn Daten entlang der Zeitdimension dicht sind. Dichte Daten haben eine konsistente Anzahl von Zeilen für jeden Zeitraum, was wiederum macht es einfach, analytische Fensterfunktionen mit physischen Offsets zu verwenden. Um zu veranschaulichen, lassen Sie uns zuerst das Beispiel auf Füllen Lücken in Daten. Und fügen Sie eine analytische Funktion zu dieser Abfrage hinzu. In der folgenden erweiterten Version berechnen wir den wöchentlichen Jahresabschluss neben dem wöchentlichen Verkauf. Die NULL-Werte, die die partitionierten äußeren Verknüpfungseinsätze bei der Herstellung der Zeitreihen dichtes behandeln, werden in der üblichen Weise behandelt: Die SUM-Funktion behandelt sie als 0s. Period-to-Period-Vergleich für eine Zeit Ebene: Beispiel Wie nutzen wir diese Funktion, um Werte über Zeiträume hinweg zu vergleichen. Speziell, wie berechnen wir einen Jahresvergleich im Vergleich zum Wochenende. Die folgende Abfrage kehrt in derselben Zeile zurück , Für jedes Produkt, die jährlichen Verkäufe für jede Woche von 2001 mit dem von 2000. Beachten Sie, dass in diesem Beispiel beginnen wir mit einer WITH-Klausel. Dies verbessert die Lesbarkeit der Abfrage und lässt uns auf die partitionierte äußere Verknüpfung konzentrieren. Wenn Sie in SQLPlus arbeiten, wickelt der folgende Befehl die Spaltenüberschriften für eine bessere Lesbarkeit der Ergebnisse ein: In der FROM-Klausel der Inline-Ansicht densesales. Wir verwenden eine partitionierte äußere Verknüpfung der aggregierten Ansicht v und der Zeitansicht t, um Lücken in den Verkaufsdaten entlang der Zeitdimension zu füllen. Die Ausgabe der partitionierten äußeren Verknüpfung wird dann durch die analytische Funktion SUM verarbeitet. Um den wöchentlichen Jahresabschluss zu berechnen (die wöchentliche Spalte). So berechnet die view densesales die jährlichen Verkaufsdaten für jede Woche, einschließlich der fehlenden in der aggregierten Ansicht s. Die Inline-Ansicht jahresübergreifend berechnet dann das Jahrjahr wöchentlich Jahresabschluss mit der LAG-Funktion. Die LAG-Funktion mit der Bezeichnung weeklyytdsalesprioryear spezifiziert eine PARTITION BY-Klausel, die Zeilen für die gleiche Woche der Jahre 2000 und 2001 in eine einzelne Partition passt. Wir übergeben dann einen Versatz von 1 an die LAG-Funktion, um das wöchentliche Jahr bis dato Umsatz für das Vorjahr zu erhalten. Der äußerste Abfrageblock wählt Daten aus dem Jahrjahr 2010 mit der Bedingung 2001 aus und damit die Abfrage zurück, für jedes Produkt, wöchentlich Jahres-Verkauf in den angegebenen Wochen der Jahre 2001 und 2000. Perioden-Perioden-Vergleich für mehrfache Zeitstufen: Beispiel Während das vorherige Beispiel uns einen Weg zeigt, um Vergleiche für ein einziges Zeitniveau zu schaffen, wäre es noch mehr Nützlich, um mehrere Zeitstufen in einer einzigen Abfrage zu behandeln. Zum Beispiel könnten wir den Umsatz im Vergleich zum Vorjahreszeitraum, Quartal, Monat und Tag vergleichen. Wie können wir eine Abfrage erstellen, die einen Jahresvergleich im Vergleich zum Jahresumsatz für alle Ebenen unserer Zeithierarchie durchführt. Wir werden mehrere Schritte zur Durchführung dieser Aufgabe durchführen. Das Ziel ist eine einzige Abfrage mit Vergleiche am Tag, Woche, Monat, Quartal und Jahr Ebene. Die Schritte sind wie folgt: Wir erstellen eine Ansicht namens cubeprodtime. Die einen hierarchischen Kubus von Verkäufen, der über Zeiten und Produkte aggregiert ist, hält. Dann werden wir einen Blick auf die Zeitdimension schaffen, die als Kante des Würfels verwendet wird. Die Zeitkante, die einen vollständigen Satz von Daten enthält, wird partitioniert, die mit den spärlichen Daten in der Ansicht cubeprodtime verbunden ist. Schließlich, für maximale Leistung, schaffen wir eine materialisierte Ansicht, mvprodtime. Gebaut nach der gleichen Definition wie cubeprodtime. Weitere Informationen zu hierarchischen Cubes finden Sie in Kapitel 21, SQL für Aggregation in Data Warehouses. Die materialisierte Ansicht ist in Schritt 1 im folgenden Abschnitt definiert. Schritt 1 Erstellen der hierarchischen Cube-Ansicht Die im Folgenden dargestellte materialisierte Ansicht kann bereits in Ihrem System vorhanden sein, wenn nicht, erstellen Sie sie jetzt. Wenn Sie es generieren müssen, beachten Sie, dass wir die Abfrage auf nur zwei Produkte beschränken, um die Verarbeitungszeit kurz zu halten: Da diese Ansicht auf zwei Produkte beschränkt ist, gibt sie nur über 2200 Zeilen zurück. Beachten Sie, dass die Spalte HierarchicalTime Stringdarstellungen der Zeit aus allen Ebenen der Zeithierarchie enthält. Der CASE-Ausdruck, der für die Spalte HierarchicalTime verwendet wird, fügt eine Markierung (0, 1.) an jede Datumsfolge an, um die Zeitniveau des Werts anzugeben. A 0 steht für das Jahr Niveau, 1 ist Quartal, 2 ist Monate und 3 ist Tag. Beachten Sie, dass die GROUP BY-Klausel eine verkettete ROLLUP ist, die die Rollup-Hierarchie für die Zeit - und Produktdimensionen angibt. Die GROUP BY-Klausel bestimmt den hierarchischen Würfelinhalt. Schritt 2 Erstellen Sie die Ansicht edgetime, das ist ein vollständiger Satz von Datumswerten edgetime ist die Quelle für das Ausfüllen von Zeitlücken im hierarchischen Würfel mit einem partitionierten äußeren Join. Die Spalte HierarchicalTime in edgetime wird in einer partitionierten Verknüpfung mit der Spalte HierarchicalTime in der Ansicht cubeprodtime verwendet. Die folgende Anweisung definiert edgetime: Schritt 3 Erstellen Sie die materialisierte Ansicht mvprodtime, um eine schnellere Leistung zu unterstützen Die materialisierte Viewdefinition ist ein Duplikat der zuvor definierten Cubeprodtime. Da es sich um eine doppelte Abfrage handelt, werden Verweise auf cubeprodtime umgeschrieben, um die mvprodtime materialisierte Ansicht zu verwenden. Die folgenden materialisierten können bereits in Ihrem System vorhanden sein, wenn nicht, erstellen Sie es jetzt. Wenn Sie es generieren müssen, beachten Sie, dass wir die Abfrage auf nur zwei Produkte beschränken, um die Verarbeitungszeit kurz zu halten. Schritt 4 Erstellen der Vergleichsabfrage Wir haben nun die Bühne für unsere Vergleichsabfrage gesetzt. Wir können Periodenvergleichsberechnungen auf allen Zeitniveaus erhalten. Es erfordert die Anwendung von analytischen Funktionen auf einen hierarchischen Würfel mit dichten Daten entlang der Zeitdimension. Einige der Berechnungen, die wir für jedes Zeitniveau erreichen können, sind: Summe der Verkäufe für vorherigen Zeitraum auf allen Zeiträumen. Umsatzabweichung im Vorjahr. Summe der Verkäufe im gleichen Zeitraum vor einem Jahr auf allen Ebenen der Zeit. Umsatzabweichung im Vorjahreszeitraum. Das folgende Beispiel führt alle vier dieser Berechnungen durch. Es verwendet eine partitionierte äußere Verknüpfung der Ansichten cubeprodtime und edgetime, um eine Inline-Ansicht von dichten Daten namens densecubeprodtime zu erstellen. Die Abfrage verwendet dann die LAG-Funktion genauso wie das vorherige einstufige Beispiel. Die äußere WHERE-Klausel legt die Zeit auf drei Ebenen fest: die Tage August 2001, den ganzen Monat und das gesamte dritte Quartal 2001. Beachten Sie, dass die letzten beiden Zeilen der Ergebnisse die Monats - und Quartalsstufenaggregationen enthalten Die Ergebnisse leichter zu lesen, wenn Sie SQLPlus verwenden, sollten die Spaltenüberschriften mit den folgenden Befehlen angepasst werden. Die Befehle werden die Spaltenüberschriften falten, um die Zeilenlänge zu reduzieren: Hier ist die Abfrage, die den aktuellen Verkauf mit dem Vorjahresverkauf verglichen hat: Die erste LAG-Funktion (Salespriorperiod) trennt die Daten auf Gidp. Katze. Subcat Prod. Gidt und ordnet die Zeilen auf allen Zeitmaßspalten an. Es erhält den Verkaufswert der Vorperiode, indem er einen Versatz von 1 übergibt. Die zweite LAG-Funktion (salessameperiodprioryear) trennt die Daten auf zusätzlichen Spalten qtrnum. Monnum Und daynum und bestellt es auf yr, so dass, mit einem Versatz von 1, kann es das Jahr zuvor Umsatz für den gleichen Zeitraum zu berechnen. Die äußerste SELECT-Klausel berechnet die Abweichungen. Erstellen eines benutzerdefinierten Member in einer Dimension: Beispiel In vielen analytischen SQL-Tasks ist es hilfreich, benutzerdefinierte Member in einer Dimension zu definieren. Zum Beispiel können Sie einen spezialisierten Zeitraum für Analysen definieren. Sie können eine partitionierte äußere Verknüpfung verwenden, um vorübergehend ein Element einer Dimension hinzuzufügen. Beachten Sie, dass die neue SQL-MODEL-Klausel geeignet ist, komplexere Szenarien mit neuen Mitgliedern in Dimensionen zu erstellen. Weitere Informationen zu diesem Thema finden Sie in Kapitel 23, SQL für Modellierung. Als Beispiel für eine Aufgabe, was, wenn wir ein neues Mitglied für unsere Zeitdimension definieren wollen, wollen wir in unserer Zeitdimension ein 13. Mitglied der Monatsstufe schaffen. Dieser 13. Monat ist definiert als die Summierung des Umsatzes für jedes Produkt im ersten Monat eines jeden Quartals 2001. Die Lösung hat zwei Schritte. Beachten Sie, dass wir diese Lösung mit den im vorherigen Beispiel erstellten Ansichten und Tabellen erstellen werden. Es sind zwei Schritte erforderlich. Zuerst erstellen Sie eine Ansicht mit dem neuen Mitglied hinzugefügt, um die entsprechende Dimension. The view uses a UNION ALL operation to add the new member. To query using the custom member, use a CASE expression and a partitioned outer join. Our new member for the time dimension is created with the following view: In this statement, the view timec is defined by performing a UNION ALL of the edgetime view (defined in the prior example) and the user-defined 13th month. The gidt value of 8 was chosen to differentiate the custom member from the standard members. The UNION ALL specifies the attributes for a 13th month member by doing a SELECT from the DUAL table. Note that the grouping id, column gidt. is set to 8, and the quarter number is set to 5. Then, the second step is to use an inline view of the query to perform a partitioned outer join of cubeprodtime with timec. This step creates sales data for the 13th month at each level of product aggregation. In the main query, the analytic function SUM is used with a CASE expression to compute the 13th month, which is defined as the summation of the first months sales of each quarter. The SUM function uses a CASE to limit the data to months 1, 4, 7, and 10 within each year. Due to the tiny data set, with just 2 products, the rollup values of the results are necessarily repetitions of lower level aggregations. For more realistic set of rollup values, you can include more products from the Game Console and Y Box Games subcategories in the underlying materialized view. Miscellaneous Analysis and Reporting Capabilities This section illustrates the following additional analytic capabilities: WIDTHBUCKET Function For a given expression, the WIDTHBUCKET function returns the bucket number that the result of this expression will be assigned after it is evaluated. You can generate equiwidth histograms with this function. Equiwidth histograms divide data sets into buckets whose interval size (highest value to lowest value) is equal. The number of rows held by each bucket will vary. A related function, NTILE. creates equiheight buckets. Equiwidth histograms can be generated only for numeric, date or datetime types. So the first three parameters should be all numeric expressions or all date expressions. Other types of expressions are not allowed. If the first parameter is NULL. the result is NULL. If the second or the third parameter is NULL. an error message is returned, as a NULL value cannot denote any end point (or any point) for a range in a date or numeric value dimension. The last parameter (number of buckets) should be a numeric expression that evaluates to a positive integer value 0, NULL. or a negative value will result in an error. Buckets are numbered from 0 to ( n 1). Bucket 0 holds the count of values less than the minimum. Bucket( n 1) holds the count of values greater than or equal to the maximum specified value. WIDTHBUCKET Syntax The WIDTHBUCKET takes four expressions as parameters. The first parameter is the expression that the equiwidth histogram is for. The second and third parameters are expressions that denote the end points of the acceptable range for the first parameter. The fourth parameter denotes the number of buckets. Consider the following data from table customers. that shows the credit limits of 17 customers. This data is gathered in the query shown in Example 22-24 . In the table customers. the column custcreditlimit contains values between 1500 and 15000, and we can assign the values to four equiwidth buckets, numbered from 1 to 4, by using WIDTHBUCKET (custcreditlimit, 0, 20000, 4). Ideally each bucket is a closed-open interval of the real number line, for example, bucket number 2 is assigned to scores between 5000.0000 and 9999.9999. sometimes denoted 5000, 10000) to indicate that 5,000 is included in the interval and 10,000 is excluded. To accommodate values outside the range 0, 20,000), values less than 0 are assigned to a designated underflow bucket which is numbered 0, and values greater than or equal to 20,000 are assigned to a designated overflow bucket which is numbered 5 (num buckets 1 in general). See Figure 22-3 for a graphical illustration of how the buckets are assigned. Figure 22-3 Bucket Assignments You can specify the bounds in the reverse order, for example, WIDTHBUCKET ( custcreditlimit. 20000. 0. 4 ). When the bounds are reversed, the buckets will be open-closed intervals. In this example, bucket number 1 is ( 15000,20000 , bucket number 2 is ( 10000,15000 , and bucket number 4, is ( 0 ,5000 . The overflow bucket will be numbered 0 ( 20000. infinity ), and the underflow bucket will be numbered 5 (- infinity. 0 . It is an error if the bucket count parameter is 0 or negative. Example 22-24 WIDTHBUCKET The followin g query shows the bucket numbers for the credit limits in the customers table for both cases where the boundaries are specified in regular or reverse order. We use a range of 0 to 20,000. Linear Algebra Linear algebra is a branch of mathematics with a wide range of practical applications. Many areas have tasks that can be expressed using linear algebra, and here are some examples from several fields: statistics (multiple linear regression and principle components analysis), data mining (clustering and classification), bioinformatics (analysis of microarray data), operations research (supply chain and other optimization problems), econometrics (analysis of consumer demand data), and finance (asset allocation problems). Various libraries for linear algebra are freely available for anyone to use. Oracles UTLNLA package exposes matrix PLSQL data types and wrapper PLSQL subprograms for two of the most popular and robust of these libraries, BLAS and LAPACK. Linear algebra depends on matrix manipulation. Performing matrix manipulation in PLSQL in the past required inventing a matrix representation based on PLSQLs native data types and then writing matrix manipulation routines from scratch. This required substantial programming effort and the performance of the resulting implementation was limited. If developers chose to send data to external packages for processing rather than create their own routines, data transfer back and forth could be time consuming. Using the UTLNLA package lets data stay within Oracle, removes the programming effort, and delivers a fast implementation. Example 22-25 Linear Algebra Here is an example of how Oracles linear algebra support could be used for business analysis. It invokes a multiple linear regression application built using the UTLNLA package. The multiple regression application is implemented in an object called OLSRegression. Note that sample files for the OLS Regression object can be found in ORACLEHOMEplsqldemo . Consider the scenario of a retailer analyzing the effectiveness of its marketing program. Each of its stores allocates its marketing budget over the following possible programs: media advertisements ( media ), promotions ( promo ), discount coupons ( disct ), and direct mailers ( dmail ). The regression analysis builds a linear relationship between the amount of sales that an average store has in a given year ( sales ) and the spending on the four components of the marketing program. Suppose that the marketing data is stored in the following table: Then you can build the following sales-marketing linear model using coefficients: This model can be implemented as the following view, which refers to the OLS regression object: Using this view, a marketing program manager can perform an analysis such as Is this sales-marketing model reasonable for year 2004 data That is, is the multiple-correlation greater than some acceptable value, say, 0.9 The SQL for such a query might be as follows: You could also solve questions such as What is the expected base-line sales revenue of a store without any marketing programs in 2003 or Which component of the marketing program was the most effective in 2004 That is, a dollar increase in which program produced the greatest expected increase in sales See Oracle Database PLSQL Packages and Types Reference for further information regarding the use of the UTLNLA package and linear algebra. CASE Expressions Oracle now supports simple and searched CASE statements. CASE statements are similar in purpose to the DECODE statement, but they offer more flexibility and logical power. They are also easier to read than traditional DECODE statements, and offer better performance as well. They are commonly used when breaking categories into buckets like age (for example, 20-29, 30-39, and so on). The syntax for simple CASE statements is: Simple CASE expressions test if the expr value equals the comparisonexpr . The syntax for searched CASE statements is: You can use any kind of condition in a searched CASE expression, not just an equality test. You can specify only 65,535 arguments and each WHEN. THEN pair counts as two arguments. To avoid exceeding this limit, you can nest CASE expressions so that the returnexpr itself is a CASE expression. Example 22-26 CASE Suppose you wanted to find the average salary of all employees in the company. If an employees salary is less than 2000, you want the query to use 2000 instead. Without a CASE statement, you might choose to write this query as follows: Note that this runs against the hr sample schema. In this, foo is a function that returns its input if the input is greater than 2000, and returns 2000 otherwise. The query has performance implications because it needs to invoke a function for each row. Writing custom functions can also add to the development load. Using CASE expressions in the database without PLSQL, this query can be rewritten as: Using a CASE expression lets you avoid developing custom functions and can also perform faster. Example 22-27 CASE for Aggregating Independent Subsets Using CASE inside aggregate functions is a convenient way to perform aggregates on multiple subsets of data when a plain GROUP BY will not suffice. For instance, the preceding example could have included multiple AVG columns in its SELECT list, each with its own CASE expression. We might have had a query find the average salary for all employees in the salary ranges 0-2000 and 2000-5000. It would look like: Although this query places the aggregates of independent subsets data into separate columns, by adding a CASE expression to the GROUP BY clause we can display the aggregates as the rows of a single column. The next section shows the flexibility of this approach with two approaches to creating histograms with CASE . Creating Histograms You can use the CASE statement when you want to obtain histograms with user-defined buckets (both in number of buckets and width of each bucket). The following are two examples of histograms created with CASE statements. In the first example, the histogram totals are shown in multiple columns and a single row is returned. In the second example, the histogram is shown with a label column and a single column for totals, and multiple rows are returned. Example 22-28 Histogram Example 1 Example 22-29 Histogram Example 2 Frequent Itemsets Instead of counting how often a given event occurs (for example, how often someone has purchased milk at the grocery), you may find it useful to count how often multiple events occur together (for example, how often someone has purchased both milk and cereal together at the grocery store). You can count these multiple events using what is called a frequent itemset, which is, as the name implies, a set of items. Some examples of itemsets could be all of the products that a given customer purchased in a single trip to the grocery store (commonly called a market basket), the web pages that a user accessed in a single session, or the financial services that a given customer utilizes. The practical motivation for using a frequent itemset is to find those itemsets that occur most often. If you analyze a grocery stores point-of-sale data, you might, for example, discover that milk and bananas are the most commonly bought pair of items. Frequent itemsets have thus been used in business intelligence environments for many years, with the most common one being for market basket analysis in the retail industry. Frequent itemset calculations are integrated with the database, operating on top of relational tables and accessed through SQL. This integration provides the following key benefits: Applications that previously relied on frequent itemset operations now benefit from significantly improved performance as well as simpler implementation. SQL-based applications that did not previously use frequent itemsets can now be easily extended to take advantage of this functionality. Frequent itemsets analysis is performed with the PLSQL package DBMSFREQUENTITEMSETS. See Oracle Database PLSQL Packages and Types Reference for more information. In addition, there is an example of frequent itemset usage in Frequent itemsets . Scripting on this page enhances content navigation, but does not change the content in any way. Introduction The previous article looked at what moving averages are and how to calculate them. This article now looks at how to implement these in Web Intelligence. The formula used here are compatible with the XIr3 version of SAP BOE however some formula may work in previous versions if available. We8217ll begin by looking at how to calculate a simple moving average before looking at weighted and exponential forms. Worked Examples The examples below all use same data set which is of stock price data in an Excel file which you can download. The first column in the file is the day of the stock price and then columns of opening price, highest price in the day, lowest price, closing price, volume and adjusted closing price. We8217ll use closing price in our analysis below along with the Date object. Simple Moving Average There is a couple of ways by which we can calculate simple moving averages. One option is to use the Previous function to obtain the value of a previous row. For example the following formula calculates a moving average on our closing stock price for a moving average data set of size 3, This is quite a simple formula however it is obvious it is not practical when we have a large number of periods here we can make use of RunningSum formula and for a data set of size N we have Finally we have a 3rd technique, Which although more complicated it may have better performance as it is calculating the new value based on previous value rather than two running sums over the full data set. However this formula only works after the Nth point in the overall data set and since it refers to a previous value we must also set a starting value. Below is the full formula used for our stock price analysis where our moving average period is 15 days, The date 1252010 is the 15th data point in our data set and so for this point we calculate a normal average using the RunningSum. For all dates beyond this value we use our SMA formula and we leave blank all dates prior to this date. Figure 1 below is a chart in Web Intelligence displaying our stock price data with a simple moving average. Figure 1. Web Intelligence Document displaying a Simple Moving Average Weighted Moving Average A weighted moving average formula with a period of 3 is, As with our first simple moving average formula above this is only practical for a small number of periods. I have not yet been able to find a simple formula that can be used for larger moving average periods. Mathematically it is possible but limitations with Web Intelligence means that these formulas don8217t convert. If anyone is able to do this I would love to hear The figure below is an WMA of period 6 implemented in Web Intelligence. Figure 2. Web Intelligence document of a Weighted Moving Average Exponential Moving Average An exponential moving average is quite straight forward to implement in Web Intelligence and so is a suitable alternative to a Weighted Moving Average. The basic formula is Here we8217ve hard coded 0.3 as our value for alpha. We only apply this formula for periods greater than our second period so we can use an if statement to filter these out. For our first and second period we can use the previous value and so our final formula for EMA is, Below is an example of an EMA applied to our stock data. Figure 3. Web Intelligence document display an Exponential Moving Average Input Controls As our EMA formula doesn8217t rely on the size of the moving average period and our only variable is alpha we can use Input Controls to allow the user to adjust the value of alpha. To do this, Create a new variable called 8216alpha8217 and define it8217s formula as, Update our EMA formula to, Create a new input control selecting our alpha variable as the input control report object Use a simple slider and set the following properties, Once done you should be able to move the slider and immediately see the changes to the trend line in the chart Conclusion We looked at how to implement three types of moving average in Web Intelligence and although all were possible the Exponential Moving Average is probably the easiest and most flexible. I hope you found this article interesting and as always any feedback is very welcome. Post navigation Leave a Reply Cancel reply You must be logged in to post a comment. The trick to Weighted Moving Average (WMA) is you have to create a variable which represents the numerators of WMA (see Wikipedia for reference.) This should look like the following: Previous(Self) (n Close) 8211 ( Previous(RunningSum(Close)) 8211 Previous(RunningSum(Close)n1) where n is the number of periods. Then the actual WMA8217s formula would be like this: Numerator (n (n 1) 2) where Numerator is the variable you created earlier.
Forex Trading Strategie 8 (Teodosi039s einfaches System) Verfasst von User am September 20, 2007 - 04:59. Dieses Forex-System wurde uns von Teodosi geschickt. Wir sind stolz darauf, dass diese Benutzer bereit sind, ihre Gedanken, Ideen und Systeme zu teilen, damit andere lernen können und handeln Forex noch erfolgreicher Danke, Teodosi Dein Beitrag wird sehr geschätzt Hallo Jungs haben ein sehr profitables System benutzt und ich möchte es teilen Es mit euch allen. Wenn jemand irgendwelche Vorschläge im offen hat, etwas Neues zu hören, um es hinzuzufügen. Das ist mein System. Ich benutze 1h Chart auf GBPJPY mit Stoch (5,3,3) und RSI (7). Meine Idee ist das. Ich benutze Stoch und RSI nur um zu definieren, wo es möglich ist, einen Ausbruch zu haben. Dann benutze ich das meiste profitable Werkzeug, das ich je probiert habe - ich benutze Leuchter. Wenn ich einen starken Trend habe und mein Stoch und RSI überkauft sind, und wir haben die Trendkerze (schwarze Kerze) in der Mitte des letzten (...
Comments
Post a Comment