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 Sebastian Meine Mai 7 13 um 13: 52Die Herausforderung Im hier versucht, die EMA für die aktuelle Tage Rekord, wo die letzten Tage EMA für den gleichen Futures-Vertrag ableiten Ist eine Eingabe. Ebenso ist die nächste Börsentage EMA abhängig von der EMA für heute. Die Verwendung eines set-basierten SQL-Ansatzes kaskadiert die Ergebnisse nicht in der gewünschten Weise. Hier sind die Details und unter Bezugnahme auf die Beispieldaten unten: EMA Formel ist: EMACurrent EMAPrevious (CLSCurrent - EMAPrevious) Konstante Where Constant in meinem Beispiel ist 0.15385 Hinweis: Der PREVTIMEKEY ist der vorherige Handelstag und nicht notwendigerweise TIMEKEY - 1 Da es Lücken aufgrund von Nichtgeschäftstagen gibt. Auch COMMSYMB sind verschiedene Rohstoffe, so dass der vorherige Datensatz nicht notwendigerweise der vorherige Handelstag für die aktuelle Ware ist. Die Daten beginnen mit einem Seed-Wert, siehe Datensätze, wo TIMEKEY 718. Dann für die Berechnung der EMA für Datensätze, wo TIMEKEY 719, wenden wir die Formel an. Unter COMMSYMB C als Beispiel erhalten wir 371,290064102564 (372,75-371,290064102564) 0,15385 371,51468 eine SQL-Satz-Ansatz, Im fähig, nur um den nächsten Wert abzuleiten (das heißt, wo TimeKey 719), aber danach alle nachfolgenden Datensätze EMAF NULL. Ich verstehe, warum, weil meine abgeleiteten Werte nicht auf die Tabelle geschrieben worden sind. So brauche ich eine Methode, um die nächsten Tage EMA ableiten, dann schreiben Sie die Ergebnisse in die Tabelle, dann die folgenden Tage EMA, schreiben Sie die Tabelle, etc. Dies wird für alle 30.000 Datensätze in der Master-Tabelle wiederholt werden. Vielen Dank im Voraus, Wayne - Beispieldaten DROP TABLE dbo. EMATEST CREATE TABLE dbo. EMATEST (TimeKey INT NOT NULL, COMMSYMB NVARCHAR (3) NOT NULL, PREVTIMEKEY INT, CLS FLOAT, EMAF FLOAT) INSERT INTO dbo. EMATEST (TimeKey, COMMSYMB, PREVTIMEKEY, CLS, EMAF) SELECT 703, C, 0, 375,5, 0 UNION SELECT ALL 703, CL, 0, 62,44, 0 UNION ALL 703 SELECT, GC, 0, 650,9, 0 UNION SELECT ALL 704, C, 703 , 704, 366, 0 UNION ALLE AUSWAHL 705, CL, 704, 62.19, UNION ALL SELECT 704, CL, 703, 62.43, 0 UNION ALLE AUSWAHL 704, GC, 703, 647.9, , 705, 637, 0 UNION ALLE AUSWAHL 706, CL, 705, 62.49, 0 UNION ALLE AUSWAHL 706, GC, 705, 637, 0 UNION ALLE AUSWAHL 707, C, 706, 368.5, 0 UNION ALLE AUSWAHL 707, CL, 706, 62.03, 0 UNION ALLE AUSWAHL 707, GC, 706, 631, 0 UNION ALL SELECT 710, C, 707, 370.75, 0 UNION ALL SELECT 710, CL, 707, 61.22, 0 UNION SELECT ALL 710, GC, 707, 634,8, 0 UNION ALL 711 SELECT, C, 710, 372,75, 0 UNION ALL 711 SELECT, CL, 710, 61.02, 0 UNION ALL SELECT 711 , 710, 631.7, 0 UNION ALL SELECT 712, C, 711, 368.25, 0 UNION ALLE SELECT 712, CL, 711, 62.17, 0 UNION ALLE SELECT 712, GC, 711, 632.4, , 712, 630.9, 0 UNION ALL SELECT 714, C, 713, 369, 0 UNION ALLE AUSWÄHLEN 714, CL, 713 , 64.09, 0 UNION SELECT ALL 714, GC, 713, 619,1, 0 UNION ALL 717 SELECT, C, 714, 365,75, 0 UNION ALL 717 SELECT, CL, 714, 62,79, 0 UNION ALL 717 SELECT, GC, 714, 617,9 , 0 UNION SELECT ALL 718, C, 717, 373, 371,290064102564 UNION ALL SELECT 718, CL, 717, 63.46, 62,6237179487179 UNION ALL SELECT 718, GC, 717, 625,4, 631,753205128205 UNION SELECT ALL 719, C, 718, 372,75, NULL UNION ALL SELECT 719, CL 718, 63.72, NULL UNION ALL SELECT 719, GC, 718, 624,3, NULL UNION ALL SELECT 720, C, 719, 377,75, NULL UNION ALL SELECT 720, CL, 719, 62.66, NULL UNION ALL SELECT 720, GC, 719, 621,6, NULL UNION ALL SELECT 721, C, 720, 384, NULL UNION ALL SELECT 721, CL, 720, 62,41, NULL UNION ALL SELECT 721, GC, 720, 622,3, NULL UNION ALL SELECT 724 , C, 721, 384, NULL UNION ALL SELECT 724, CL, 721, 62,41, NULL UNION SELECT ALL 724, GC, 721, 622,3, NULL UNION ALL SELECT 725, C, 724, 388, NULL UNION ALL SELECT 725, CL , 724, 61,1, NULL UNION SELECT ALL 725, GC, 724, 626,9, NULL UNION ALL SELECT 726, C, 725, 386,75, NULL UNION ALL SELECT 726, CL 725, 60.34, NULL UNION ALL SELECT 726, GC, 725 , 630,3, NULL UNION ALL SELECT 727, C, 726, 388,5, NULL UNION SELECT ALL 727, CL 726, 60.53, NULL UNION ALL SELECT 727, GC, 726, 636,9, NULL UNION ALL SELECT 728, C, 727, 390,25 , NULL UNION SELECT ALL 728, CL, 727, 61.05, NULL UNION ALL SELECT 728, GC, 727, 638, NULL - Die erwarteten Ergebnisse DROP TABLE dbo. EMAER TABLE dbo. EMAER CREATE (TimeKey INT NOT NULL, COMMSYMB NVARCHAR ( 3) NOT NULL, PREVTIMEKEY INT, CLS FLOAT, EMAF FLOAT) INSERT INTO dbo. EMAER (TimeKey, COMMSYMB, PREVTIMEKEY, CLS, EMAF) SELECT 703, C, 0, 375,5, 0 UNION SELECT ALL 703, CL, 0, 62,44 0, 650.9, 0 UNION ALLE AUSWAHL 704, C, 703, 378, 0 UNION ALLE AUSWAHL 704, CL, 703, 62.43, 0 UNION ALLE AUSWAHL 704, GC, 703, 647.9, 0 UNION ALLE AUSWAHL 705, C, 704, 366, 0 UNION ALLE AUSWAHL 705, CL, 704, 62.19, 0 UNION ALLE AUSWAHL 705, GC, 704, 635.9, 0 UNION ALLE AUSWAHL 706, C, 705, 372,5, SELECT 706, CL, 705, 62.49, 0 UNION ALLE AUSWAHL 707, GC, 705, 637, 0 UNION ALLE AUSWAHL 707, C, 706, 368.5, 0 UNION ALLE AUSWAHL 707, CL, 706, 62.03, 0 UNION ALL SELECT 707 , 707, 634.8, 0 UNION ALL SELECT 710, C, 707, 370.75, 0 UNION ALLE AUSWAHL 710, CL, 707, 61.22, , 710, 631.7, 0 UNION ALLE SELECT 712, C, 711, 368.25, 0 UNION ALLE AUSWAHL 712, CL, 711 , 62.17, 0 UNION SELECT ALL 712, GC, 711, 632,4, 0 UNION ALL 713 SELECT, C, 712, 371,75, 0 UNION ALL 713 SELECT, CL, 712, 63.33, 0 UNION ALL 713 SELECT, GC, 712, 630,9 , 713, 619.1, 0 UNION ALLE SELECT 714, C, 713, 369, 0 UNION ALLE SELECT 714, CL, 713, 64,09, 0 UNION ALLE AUSWAHL 717, C, 714, 365,75, 0 UNION ALL SELECT 717, CL, 714, 62,79, 0 UNION SELECT ALL 717, GC, 714, 617,9, 0 UNION ALL 718 SELECT, C, 717, 373, 371,290064102564 UNION ALL 718 SELECT, CL, 717, 63.46, 62,6237179487179 UNION ALL SELECT 718, GC, 717, 625,4, 631,753205128205 UNION ALL SELECT 719, C, 718, 372,75, 371,514675240385 UNION SELECT ALL 719, CL 718, 63.72, 62,7923809423077 UNION ALL SELECT 719, GC, 718, 624,3, 630,606529519231 UNION ALL SELECT 720 , C, 719, 377,75, 372,473979954651 UNION ALL SELECT 720, CL, 719, 62.66, 62,7720141343336 UNION ALL SELECT 720, GC, 719, 621,6, 629,220874952697 UNION ALL 721 SELECT, C, 720, 384, 374,247258138628 UNION SELECT ALL 721, CL , 720, 62,41, 62,7163182597664 UNION ALL SELECT 721, GC, 720, 622,3, 628,156098341225 UNION ALL SELECT 724, C, 721, 384, 375,747717474 UNION SELECT ALL 724, CL, 721, 62,41, 62,6691911955013 UNION ALL SELECT 724, GC, 721 , 622,3, 627,255137611427 UNION ALL 725 SELECT, C, 724, 388, 377,632731140625 UNION ALL SELECT 725, CL, 724, 61,1, 62,4277711300734 UNION ALL SELECT 725, GC, 724, 626,9, 627,200499689909 UNION SELECT ALL 726, C, 725, 386,75 , 379,03542295464 UNION SELECT ALL 726, CL 725, 60.34, 62,1065675417116 UNION ALL SELECT 726, GC, 725, 630,3, 627,677357812617 UNION ALL SELECT 727, C, 726, 388,5, 380,491548133069 UNION SELECT ALL 727, CL 726, 60.53, 61,8640126254193 UNION ALL SELECT 727, GC, 726, 636,9, 629,096261313146 UNION ALL SELECT 728, C, 727, 390,25, 381,992885952796 UNION ALL 728 SELECT, CL, 727, 61.05, 61,7387767829985 UNION ALL SELECT 728, GC, 727, 638, 630,466101510118 Lynn Pettis (30.01.2009) Erstaunlich, wie viele Probleme zu lösen scheinen mit der laufenden Summen Ansatz zu Zeiten gelöst werden. ) Yep. Dies wurde vor langer Zeit von den großen SQL-Datenbank-Venders in Form von OLAP, analytische Fenster-Funktionen (dh rownumber () über .. etc) erkannt. Und um ihre Kunden davon abzuhalten, zu anderen Arten von Software zu gehen. Ihr Hauptanliegen war, dass die Lösungen relativ einfach sein müssen. (Anmerkung, sie hatten die Voraussicht, um zu sehen, dass diese Funktionen begrifflich Verwirrung Benutzer. Aber das ist ein anderes Thema für ein anderes Mal :) Betrachten Sie die folgenden aus einer sql-99-Standard-Dokument: ISO / IEC JTC1 / SC32 WG3: YGJ-068 ANSI NCITS H2 -99-154r2 Einführung in OLAP-Funktionen Mai 5, 1999 cse. iitb. ac. in/dbms/Data/Papers-Other/SQL1999/OLAP-99-154r2.pdf Jeder Standard muss bereit sein, neue Probleme anzugehen, Markt entwickelt. Manchmal erfordert dies das Brechen der Form. Heute wird die SQL-Community durch die Entstehung von OLAP mit ihren besonderen Anforderungen herausgefordert. Wenn SQL nicht positiv auf diese Herausforderung reagiert, wird SQL für ein wichtiges und wachsendes Segment der Datenbankindustrie irrelevant. Leider teilt MS nicht die sql-Ansicht des Dienstprogramms von OLAP. Wenn sie es getan hätten, hätten sie das alles schon jetzt implementiert :) Natürlich wollte RAC etwas von dem Hang abholen:) Wir hatten eine Herausforderung, die 20 (Handelstage) Exponential Moving Average (EMA) in unsere Daten zu legen Modell in PowerPivot. Hier ist die EMA-Formel und die Stichprobenkalkulationstabelle: stockcharts / school / doku. phpidchartschool: technischeindikatoren: movingaverages Für die Bequemlichkeit die Formel eingefügt: SMA (einfacher gleitender Durchschnitt): 10 Periodensumme / 10 Multiplikator: 2 / (Zeitraum 43 1)) EMA: x Multiplikator 43 EMA (Vortag). In unserem Modell haben die Faktentabelle diese Spalten: Symbol Datum Öffnen Hoch Niedrig Schließen Volumen In der Kalendertabelle haben wir die Handelstage (CalendarTradingDayNumber.) Aufgelistet ) Als 1, damit wir sie zurückzählen können. Wir wollen, dass das EMA-berechnete Feld in einer Pivot-Tabelle wie diesem Filterkontext: ein Datum, das bei CalendarFullDate ausgewählt wurde. Row-Kontext: FactTableSymbol Werte: FactTableClose FactTableEMA 20D gtgt Fehlen Bisher haben wir diese berechneten Felder erhalten: Ema Multiplier 2 / (Periode 43 1) Durchschnitt 20D IF CLOSE (Summe der CLOSEBLANK (), BLANK (), (CALCULATE (MITTELWERT (FactTableCLOSE), FILTER (ALL (Kalender), CalendarTradingDayNumberltMAX (CalendarTradingDayNumber) ampamp CalendarTradingDayNumbergtMAX (CalendarTradingDayNumber) - Periode)))) Aber es sieht aus wie die EMA Formel Enthält einen Selbstreferenzwert aus früheren Werten und beginnt auch mit einem SMA (Average 20D CLOSE) Wert. Wie können wir es tun Vielen Dank im Voraus. Ich schätze Ihre Unterstützung sehr. Samstag, 19. Juli 2014, 21:42 Uhr
Comments
Post a Comment