Thursday 23 February 2017

Oracle Moving Average Abfrage

Wenn Sie diese Meldung sehen, hat Ihr Browser entweder deaktiviert oder unterstützt kein JavaScript. Um die vollständigen Funktionen dieses Hilfesystems, z. B. die Suche, nutzen zu können, muss Ihr Browser JavaScript-Unterstützung aktiviert haben. Weighted Moving Averages Mit Simple Moving Averages wird jeder Datenwert in dem Windowquot, in dem die Berechnung durchgeführt wird, eine gleiche Bedeutung oder Gewicht zugewiesen. Es ist oft der Fall, vor allem in der Finanzdaten-Daten-Analyse, dass mehr chronologisch jüngsten Daten ein größeres Gewicht tragen sollte. In diesen Fällen wird der gewichtete gleitende Durchschnitt (oder der exponentielle gleitende Durchschnitt - siehe das folgende Thema) häufig bevorzugt. Betrachten Sie die gleiche Tabelle der Verkaufsdatenwerte für zwölf Monate: Um einen gewichteten gleitenden Durchschnitt zu berechnen: Berechnen Sie, wie viele Intervalle von Daten an der Moving Average Berechnung beteiligt sind (d. h. die Größe des rechnerischen Windowquot). Wenn das Berechnungsfenster n ist, wird der jüngste Datenwert in dem Fenster mit n multipliziert, der nächstletzte multipliziert mit n-1, der Wert vor dem multipliziert mit n-2 und so weiter für alle Werte im Fenster. Teilen Sie die Summe aller multiplizierten Werte durch die Summe der Gewichte, um den gewichteten gleitenden Durchschnitt über diesem Fenster zu erhalten. Stellen Sie den Weighted Moving Average-Wert in eine neue Spalte entsprechend der oben beschriebenen Positionierung der mittleren Mittelwerte ein. Um diese Schritte zu veranschaulichen, sollten Sie berücksichtigen, ob ein dreimonatiger gewichteter gleitender Durchschnitt der Verkäufe im Dezember erforderlich ist (unter Verwendung der obigen Tabelle der Verkaufswerte). Der Begriff "3-monthquot" impliziert, dass das Berechnungsfenster für den Windowquot 3 ist, daher sollte der Algorithmus für den Weighted Moving Average-Berechnungsfaktor für diesen Fall sein: Oder, wenn ein 3-Monats-Weighted Moving Average über den gesamten ursprünglichen Datenbereich ausgewertet würde : 3 Monate Weighted Moving AverageExponential Moving Average Es gab eine schöne Frage auf OTN heute darüber, ob es eine Standard-Oracle-Funktion, um den exponentiellen gleitenden Durchschnitt zu berechnen. Die Antwort ist, dass es keine solche Funktion, aber mit der Modell-Klausel, können Sie es sehr einfach zu berechnen. Und seine ein großes Beispiel dessen, was ich meine mit variablen Anzahl von Berechnungen auf der Grundlage berechneter Werte, geschrieben in meinem dritten Teil des Modells Klausel Tutorial. Vor heute, ich didnt sogar wissen, was ein exponentieller gleitender Durchschnitt genau war. Mehr dazu findet ihr hier auf Wikipedia oder hier mit einem schönen Beispiel. Aus dem ersten Link: Ein exponentieller gleitender Durchschnitt (EMA) wendet Gewichtungsfaktoren an, die exponentiell abnehmen. Die Gewichtung für jeden älteren Datenpunkt nimmt exponentiell ab, was den neueren Beobachtungen viel mehr Bedeutung verleiht, während ältere Beobachtungen nicht vollständig vernachlässigt werden. Aus dem zweiten Link: Die Formel für die Berechnung eines Exponential Moving Average (EMA) ist: X Aktueller EMA (dh zu berechnender EMA) C Aktueller Originaldatenwert K Glättung Konstante P Vorherige EMA (Die erste EMA im berechneten Bereich ist K Smoothing Constant 2 (1 n) Auf diese Formel folgt ein Beispiel, das ich ein Bit erweitert habe, und zwar mit dieser Tabelle: Die Datensätze von Produkt A Ich habe die Zahlen aus Produkt B. Hier ist die Modell-Klausel Abfrage, die die Formel implementiert. Beachten Sie, wie die Formel direkt in die einzige Regel der Modell-Klausel zu übersetzen. Die Glättungskonstante K ist gesetzt Auf 5, basierend auf einem Fenster von Werten (n) gleich 3. Challenge: versuchen Sie dies ohne die Modell-Klausel und sehen, ob Sie kommen können mit etwas umfangreicher. 5 Kommentare: 11.2 Funktionen in Verwendung mit dat as (select 39A39 product Datum 392009-01-0139 Monat, 10 Betrag aus Dual Union alle auswählen 39A39, Datum 392009-02-0139, 15 aus Dual Union alle auswählen 39A39, Datum 392009-03-0139, 17 aus Dual Union alle wählen 39A39, Datum 392009 -04-0139, 20 aus Dual Union alle auswählen 39A39, Datum 392009-05-0139, 22 aus Dual Union alle auswählen 39A39, Datum 392009-06-0139, 20 aus Dual Union alle auswählen 39A39, Datum 392009-07-0139, 25 aus Dual Union alle auswählen 39A39, Datum 392009-08-0139, 27 aus Dual Union alle auswählen 39A39, Datum 392009-09-0139, 30 aus Dual Union alle auswählen 39A39, Datum 392009-10-0139, 35 aus Dual Union alle Wählen Sie 39A39, Datum 392009-11-0139, 37 aus Dual Union alle auswählen 39A39, Datum 392009-12-0139, 40 aus Dual Union alle 39B39 wählen, Datum 392009-01-0139, 0 aus Dual Union alle wählen 39B39, Datum 392009 -02-0139, 50 aus Dual Union alle auswählen 39B39, Datum 392009-03-0139, 10 aus Dual Union alle auswählen 39B39, Datum 392009-04-0139, 40 aus Dual Union alle auswählen 39B39, Datum 392009-05-0139, 15 aus Dual Union alle wählen 39B39, Datum 392009-06-0139, 35 aus Dual Union alle auswählen 39B39, Datum 392009-07-0139, 30 aus Dual Union alle wählen 39B39, Datum 392009-08-0139, 30 aus Dual Union alle Auswählen 39B39, Datum 392009-09-0139, 20 aus Dual Union alle auswählen 39B39, Datum 392009-10-0139, 20 aus Dual Union alle 39B39 auswählen, Datum 392009-11-0139, 20 aus Dual Union alle wählen 39B39, Datum 392009 -12-0139, 20 von dual), rns as (select dat. . Rownumber () over (Partition nach Produkt Reihenfolge nach Monat) rn -. 2 (1count () über (Teilung durch Produkt)) k. 0.5 k von dat), res (Produkt, Monat, Betrag, rn, x) als (wählen Sie r. product, r. month, r. amount, r. rn, r. amount x aus rns r, wobei rn 1 union alle auswählen (Ns. amount - es. x) es. xx von rns ns, res es, wo ns. rn es. rn 1 und ns. product es Produkt, Monat, Betrag, rn, Runde (x, 3) EMA aus res Reihenfolge nach Produkt, Monat nach der Berechnung der geschlossenen Form Ich kam mit dem folgenden Code, dass mehr wie eine Verschleierung als alles umfassende. Die Idee ist, laufende Multiples mit einer Stringverkettung und der xml-eval-Funktionalität zu erstellen. Die geschlossenen Formen der Sonderfälle brauchen nur laufende Summen. Es gibt einen allgemeinen Fall und zwei spezielle Fälle, die viel einfacher sind: mit t1 als (Produkt, Monat, Betrag, Menge ci, rownumber () über (Teilung durch Produkt Reihenfolge nach Monat) rn, --2 (1 rownumber () über (Produktauswahl, Monat, Betrag, (Fall bei rn 1 und 1 sonst ki end ci) ai, Fall bei rn 1 und 1 sonst (1 - Ki) ende bi von t1), t3 als (SELECT-Produkt, MONTH, Menge, ai, xmlquery (REPLACE (wmconcat (bi) über (PARTITION BY Produkt ORDER BY MONTH Zeilen ZWISCHEN unbeschränkte vorhergehende AND CURRENT ROW), 39,39, 3939 ) RETURNING-Inhalt).getnumberval () mi FROM t2), t4 as (Produkt, Monat, Betrag, mi, (ai mi) xi aus t3 auswählen) Produkt, MONTH, Menge, Runde (mi SUM (xi) over (PARTITION BY Produkt ORDER BY MONTH Zeilen ZWISCHEN unbeschränkte vorhergehende AND CURRENT ROW), 3) ema FROM t4 Spezialfall K 0.5: mit t1 als (Produkt, Monat, Betrag, Rownumber () auswählen (Partition nach Produkt Reihenfolge pro Monat) rn, Betrag (1, 0), 1)) ci vom Verkauf) Produkt, Monat, Betrag, Runde (sum (ci) über (Partition von (2, rn), 3) ema von t1 Sonderfall K 2 (1 i): mit t1 als (Produkt, Monat, Betrag, Rownumber () wählen (Partition Nach Produkt sortiert nach Monat) rn, Menge rownumber () über (Teilung nach Produkt Sortierung nach Monat) ci vom Verkauf) Produkt, Monat, Betrag, Umlauf (Summe (ci) Und die aktuelle Zeile) 2 (rn (rn 1)), 3) ema von t1 I39ll den Beweis der geschlossenen Form, wenn irgendjemand daran interessiert ist. Dies ist ein großes Beispiel für quotfun mit SQLquot :-) Eine Kombination von XMLQuery, die undokumentierte wmconcat und analytische Funktionen mit der windowing-Klausel. Ich mag das. Obwohl es nicht so umfassend ist wie die Modellklauselvariante und die Rafu39s rekursiv mit einem, wie Sie selbst sagten. Und sicher sehen wir den Beweis der geschlossenen Gestalt. Ich habe eine Frage gestellt: wie man die Glättungskonstante SELECT k - Glättungskonstante optimiert. Ms - mittlerer quadratischer Fehler FROM (SELECT FROM sales MODEL DIMENSION BY (Produkt: ROWNUMBER () OVER (PARTITION BY Produkt ORDER BY Monat ASC) rn) MASSNAHMEN (Betrag - Verkaufsmenge Monat Monat AS S - quadrierter Fehler - - Arbeitszeile und Attribute - a) Arbeitszeile ist Produkt 39X39, rn 1 - b) Arbeitsattribute sind wie folgt:. 0 AS SSE - Summe SE für alle ProdukteMonate. 0 AS MSE - bedeuten SSE für alle ProdukteMonate. 0 AS k - für alle ProdukteMonate. 0 AS PreMSE - vor k39s MSE für alle productsmonths. 0 AS diff - zwischen aktuellem MSE und vorherigen. 0,1 AS Delta - Anfangsschritt. 0 AS priorpt - anfänglicher Startpunkt -) RULES ITERATE (99) UNTIL (abs (diff39A39,1) lt 0,00010) (Cany, rn amountcv (), cv () K39A39,1 priorpt39A39,1 delta39A39,1 Xany , Rn ORDER BY Produkt, rn ASC COALESCE (K39A39,1 Ccv (), cv () (1-K39A39,1) Xcv (), cv () - 1, Ccv (), cv ()).Produkt, rn Xcv (), Cv () - 1. SEproduct, rn POWER (Ccv (), cv () - Xcv (), cv () - 1, 2) SSE39A39,1 SUM (SE) beliebig (SE) beliebige 24. diff39A39,1 CASE-Iterationsnummer WHEN 0 dann NULL ELSE preMSE39A39,1 MSE39A39,1 delta39A39,1 CASE WHEN diff39A39,1 lt 0 THEN - abs (delta39A39, 12) ELSE abs (delta39A39,1) END. Priorpt39A39,1 K39A39,1)), wobei das Produkt 39A39 und rn 1 K MSE ---------- ---------- .599999237 174.0160941 . Wie legen Sie die Werte der Transaktionsspalte 2 fest. Was bedeutet 00 bedeuten 3. Wie wird der Wert der Inventory Units abgeleitet 4. Ist die Ausgabe unter der Überschrift Details der erwartete Wie über Ihnen geben Sie uns eine Beispiel-Abfrage zu Beginn mit Erstellen von Tabelle und Probeneinsätze sind ebenfalls zu schätzen. Die Ergebnisse und Erklärungen, die Sie veröffentlicht haben, sind sehr gut. Sie müssen CREATE TABLE - und INSERT-Anweisungen für die Beispieldaten posten. Es würde auch helfen, wenn Sie weniger Leerraum in der Beispielausgabe verwendet. Ich kann nicht sehen, alle Ergebnisse zur gleichen Zeit, und ich habe eine ziemlich breite Bildschirm. In Oracle 11.2 können Sie dies mit einer rekursiven WITH-Klausel tun. In Oracle 10.1 können Sie dies mit MODEL tun. In Oracle 9 (was auch immer die genaue Version ist) können Sie es wahrscheinlich mit analytischen Funktionen: vielleicht AVG, oder vielleicht SUM. Warum ist der gleitende Durchschnitt am 8. Mai 10.50 und nicht 10.25 Als Frank sagte, es hätte schön sein sollen, wenn Sie Tabellenerstellung und Daten gepostet haben. Hier ist eine Methode, aber nicht sicher ist Ihre Bedürfnisse anzupassen. Ich schlage vor, mit PLSQL für diese. Es wird viel einfacher zu debuggen und zu pflegen. Heres eine sehr unpolished Weise, es in reinen SQL: Output: Sorry, ich habe keine Oracle 9-Datenbank jetzt. Ich testete dieses in Oracle 10.2, und ich glaube nicht, dass theres alles in ihm, das nicht das gleiche in Oracle arbeitet 9. Im das Denken über das Schreiben eines Buches über analytische Funktionen. Dies könnte ein gutes Problem sein, um in das Buch, aber vielleicht nicht, denn wenn ich es gut erklärt, es würde nicht Platz für alles andere in dem Buch. Im noch versucht, es selbst zu verstehen. Die Grundstrategie besteht darin, die Zeilen in Gruppen von 1 oder mehr aufeinanderfolgenden Zeilen anzuordnen, wobei die letzte (in der Reihenfolge nach datierten) Einheiten & thgr ;, und alle anderen Einheiten & thgr; Das ist, was Unterabfrage gotgrpid tut. Die nächste Unterabfrage, gotrr, berechnet ein Verhältnis der verkauften Einheiten, die vom Gesamtbestand am Ende jeder Gruppe geteilt werden. Zum Beispiel die Gruppe, die am 15. Mai endet, hat 600 Einheiten verkauft, und ein Gesamt-Inventar von 900. Das bedeutet, dass, ab 15. Mai, die durchschnittlichen Kosten werden ein gewichteter Durchschnitt, 600900 (23) des Durchschnitts wird der Preis sein Von diesem Verkauf, und die verbleibenden 13 werden vom vorherigen Durchschnitt abhängen, der seinerseits ein ähnliches Verhältnis jener Gruppenkosten sein wird, die durch das Inventar an diesem Punkt geteilt werden, und dann multipliziert mit den Kosten. So dass die durchschnittlichen Kosten ab 15. Mai erfordert Multiplikation dieser Verhältnisse und Preise für alle vorherigen Gruppen, dh Mai 3 und Mai 1. Es gibt keine aggregierte PRODUCT-Funktion, die alle Zahlen in einer Gruppe multipliziert, wie die SUM alle addiert die Zahlen. (Das heißt, thers keine eingebaute PRODUCT-Funktion. Sie können benutzerdefinierte aggregate fucntions schreiben, die in Oracle 9 beginnen. Als benutzerdefinierte Aggregatfunktionen gehen, ist seine eine der einfachsten, aber der ganze Punkt hier, PLSQL zu vermeiden.) Jedoch können Sie das Produkt einer Spalte von Zahlen erhalten, indem Sie das natürliche Protokoll nehmen, alle Protokolle hinzufügen und das Heben e zu dieser Energie, die ist, was Unterabfrage gotpct tut. Das erklärt genau, welcher Prozentsatz des Preises an jeder Verkaufsstelle von den Kosten an diesem Punkt abgeleitet wird. Das Erhalten des acutal Mittels ist nur eine Frage des Addierens jene Zahlen für jede Reihe, die ist, was die letzte Unterabfrage, gotavgcost, tut. Es gibt viele Dinge, die ich kenne, die über diese Abfrage vereinfacht werden können. Ich habe in einer Menge von unnötigen Dinge, die ich versucht, während während des Schreibens, nur für den Fall, dass sie geholfen zu zeigen, wie die Abfrage funktionierte. Ich habe das Gefühl, dass es einen viel besseren Ansatz für dieses Problem, das wird viel weniger complicted Code erfordern. Insbesondere ich vermute, Gruppierung der Zeilen, so dass die erste Zeile jeder Gruppe unitsgt0 könnte einfacher sein. Vielleicht krank, dass morgen versuchen. Herausgegeben von: Frank Kulash on Jun 1, 2012 9:19 AM Im im Stande, dies in Oracle 9.2.0.6.0 jetzt testen. Es klappt. guter Eintrag. Ich weiß, es war kompliziert und ich konnte mir nicht vorstellen, wie das geht. Wenn Sie ein Buch über analytische Funktionen schreiben, lassen Sie es mich wissen. Im sicher, dass ich viel von Ihrem Buch lernen kann. Ich denke, es hat ein Problem, wenn wir machen Mai 25 Einheiten von -400 bis -1100 dann die anderen vorangehenden Kauf wird eine falsche Kosten haben. Wenn das Inventar wieder auf Null ist, dann wird der vorherige AveCost des Kaufs nicht funktionieren, mit einem größeren Wert Edited by: 957547 on Sep 16, 2012 10:17 PM Edited by: 957547 on Sep 16, 2012 10:19 PM just another try with Rekursive Abfrage mit t als (Auswahl datiert, Einheiten, Kosten, Verzögerung (datiert, 1) über (Reihenfolge nach datiert) prevd vom Test), q (datiert, Einheiten, unitsum, Kosten Wac, (T. units q. unitsum) unitum, t. cost, case, t. cost, t. cost, case, wenn t. Kosten 0 dann q. wac sonst (t. units t. cost q. unitsum q. wac) (t. unitsq. unitsum) Ende als wac, ql 1 l von q, t wobei t. prevd q. dated) wählen Sie datiert, Einheiten, unitsum, Kosten, wac. L von q


No comments:

Post a Comment