Ich habe die Diskussion gelesen, die Sie erwähnt haben. Es ist auf PostgreSQL anwendbar, da es erlaubt ist, benutzerdefinierte Aggregatfunktion mit SQL in PostgreSQL zu erstellen, aber nicht in SQL Server erlaubt. Die Verwendung von rekursiven CTE ist ein möglicher Weg in SQL Server, aber ich merke, dass CTE-Wege möglicherweise mehr Tabellen-Scan als Fenster-Funktionen. So mache ich diesen Beitrag zu fragen, ob es möglich ist, zu berechnen exponentiellen gleitenden Durchschnitt mit SQL Server 2012 Fensterfunktion genau wie die Berechnung einfach gleitenden Durchschnitt. Ndash xiagao1982 Apr 14 13 at 2:53 Zuerst berechnen Sie die EMA (SMA (x)) anstelle der EMA (x). Zweitens ist Ihre quotsmoothing constantquot eigentlich der Beta-Wert in meiner Formel, nicht die alpha. Mit diesen beiden Änderungen sieht das SQLFiddle wie folgt aus: sqlfiddle / 6/19192/1 Es gibt jedoch noch einen kleinen Unterschied zwischen dem tatsächlichen Ergebnis und dem erwarteten Ergebnis. Ich würde zurückgehen und sehen, ob ihre EMA-Definition entspricht der, die ich kenne. Ndash Sebastian Meine 7 Mai, um 13:46 Ich schaute nur auf das Formular in der Kalkulationstabelle Sie angebracht und es ist weit weg von der Standard-EMA-Definition. Meine Formel berechnet den exponentiellen gleitenden Durchschnitt der letzten zehn Zeilen. Die Kalkulationstabelle berechnet zuerst den Standardmittelwert über die letzten zehn Zeilen und dann den unbeschränkten exponentiell gewichteten gleitenden Durchschnitt über alle Mittelwerte. Dies folgt dem Formular hier: en. wikipedia. org/wiki/EWMAchart ndash Es war eine schöne Frage an OTN heute darüber, ob es eine Standard-Oracle-Funktion, um die 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 jüngsten 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 aus dem Produkt Eine Übereinstimmung mit dem Beispiel in der Verknüpfung Ich habe die Zahlen aus Produkt B. Hier ist die Modellklausel Abfrage, die die Formel implementiert. Beachten Sie, wie die Formel direkt in die einzige Regel der Modellklausel zu übersetzen. Die Glättungskonstante K ist Auf 0 gesetzt, basierend auf einem Fenster von Werten (n) gleich 3. Challenge: versuchen Sie dies ohne die Modell-Klausel und sehen Sie, wenn Sie kommen können, etwas umfangreicher 5 Kommentare: 11.2 Funktionen im Einsatz mit dat as (select 39A39 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 auswä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 auswählen 39A39, Datum 392009-11-0139, 37 aus Dual Union alle auswählen 39A39, Datum 392009-12-0139, 40 aus Dual Union alle wählen 39B39, Datum 392009-01-0139, 0 aus Dual Union alle auswä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 wählen 39B39, Datum 392009-05-0139 , 15 aus Dual Union alle auswä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 auswählen 39B39, Datum 392009-11-0139, 20 aus Dual Union alle auswä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 () überschreiben (Partition nach Produkten pro Monat) rn, --2 / (1 rownumber () (Auswahl nach Produkt, Monat, Betrag, (Fall bei rn 1 dann 1 sonst ki Ende ci) ai, Fall bei rn 1, dann 1 sonst (1 - ki) Ende bi von t1), t3 als (SELECT-Produkt, MONTH, Betrag, ai, xmlquery (REPLACE (wmconcat (bi) over (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, MONAT, Menge, Runde (mi SUM (xi) (PARTITION DURCH Produkt ORDER BY MONTH Zeilen zwischen unbeschränkte vorhergehende UND CURRENT ROW), 3) ema FROM t4 Spezialfall K 0.5: mit t1 als (Produkt, Monat, Betrag, Rownumber () auswählen (Partition nach Produkt Reihenfolge nach Monat) rn , Menge Leistung (2, nvl (nullif (rownumber () über (Teilung durch Produkt Reihenfolge pro Monat) - 1, 0), 1)) ci vom Verkauf) Produkt, (2, rn), 3) ema von t1 Sonderfall K 2 / (1 i): mit t1 als (Produkt, Monat, Betrag, Rownnummer ( ) (Stückzahl pro Monat) rn, Menge rownumber () über (Teilung nach Produktauftrag pro Monat) ci vom Verkauf) Produkt, Monat, Betrag, Umlauf (Summe (ci) Zeilen zwischen unbegrenzter vorangehender und aktueller 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 MODELL DIMENSION BY (Produkt: ROWNUMBER () OVER (PARTITION BY Produkt ORDER BY Monat ASC) rn) MASSNAHMEN (Betrag - Verkaufsmenge Monat Monat 0 ASC 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 Produkte / Monate. 0 AS MSE - mittlere SSE für alle Produkte / Monate. 0 AS k - für alle Produkte / Monate. 0 AS PreMSE - vor k39s MSE für alle Produkte / Monate. 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) beliebig, beliebig / 24. diff39A39,1 CASE-Iterationszahl WHEN 0 dann NULL ELSE preMSE39A39,1 - MSE39A39,1 END. delta39A39,1 CASE WHEN diff39A39,1 lt 0 THEN - abs (delta39A39 , 1/2) ELSE abs (delta39A39,1) END priorpt39A39,1 K39A39,1)), wobei das Produkt 39A39 und rn 1 / K MSE ---------- --------- - .599999237 174.016094
Comments
Post a Comment