Friday 13 October 2017

Moving Average Query Sql


Ich arbeite mit SQL Server 2008 R2 und versuche, einen gleitenden Durchschnitt zu berechnen. Für jeden Datensatz meiner Ansicht nach möchte ich die Werte der 250 vorherigen Aufzeichnungen sammeln und dann den Durchschnitt für diese Auswahl berechnen. Meine Ansichtspalten sind wie folgt: TransactionID ist eindeutig. Für jede TransactionID. Ich möchte den Durchschnitt für Spaltenwert berechnen, über vorherige 250 Datensätze. Also für TransactionID 300, sammle alle Werte aus vorherigen 250 Zeilen (Ansicht wird absteigend von TransactionID sortiert) und dann in Spalte MovAvg das Ergebnis des Mittelwertes dieser Werte schreiben. Ich bin auf der Suche nach Daten in einer Reihe von Datensätzen zu sammeln. Fragte am 28.10 um 20: 58Dies ist eine immergrüne Joe Celko Frage. Ich ignoriere die DBMS-Plattform. Aber auf jeden Fall konnte Joe vor mehr als 10 Jahren mit Standard-SQL antworten. Joe Celko SQL Puzzles and Answers Zitat: Dieser letzte Update-Versuch schlägt vor, dass wir das Prädikat verwenden könnten, um eine Abfrage zu konstruieren, die uns einen gleitenden Durchschnitt geben würde: Ist die zusätzliche Spalte oder die Abfrage besser angegangen Die Abfrage ist technisch besser, weil der UPDATE-Ansatz wird Denormalisieren der Datenbank. Allerdings, wenn die historischen Daten aufgezeichnet werden nicht zu ändern und die Berechnung der gleitenden Durchschnitt ist teuer, können Sie die Verwendung der Spalte Ansatz. SQL Puzzle Abfrage: mit allen Mitteln einheitlich. Sie werfen einfach auf die passende Gewicht Eimer abhängig von der Entfernung von der aktuellen Zeitpunkt. Zum Beispiel quottake weight1 für datapoints innerhalb von 24hrs aus aktueller datapoint weight0.5 für datapoints innerhalb von 48hrsquot. In diesem Fall ist es wichtig, wie viel aufeinanderfolgende Datenpunkte (wie 6:12 Uhr und 11:48 Uhr) von einander entfernt sind. Ein Anwendungsfall, den ich mir vorstellen kann, wäre ein Versuch, das Histogramm zu glätten, wo Datapunkte nicht dicht genug sind, ndash msciwoj Mai 27 15 at 22:22 Ich bin mir nicht sicher, dass Ihr erwartetes Ergebnis (Output) klassisch einfaches (rollendes) Durchschnitt für 3 Tage zeigt. Denn zum Beispiel gibt das erste Dreifach von Zahlen per Definition: aber du erwartest 4.360 und seine Verwirrung. Trotzdem schlage ich die folgende Lösung vor, die die Fensterfunktion AVG verwendet. Dieser Ansatz ist viel effizienter (klar und weniger ressourcenintensiv) als SELF-JOIN in anderen Antworten eingeführt (und Im überrascht, dass niemand eine bessere Lösung gegeben hat). Sie sehen, dass AVG mit Fall verpackt wird, wenn rownum gt p. days dann, um NULLs in den ersten Reihen zu zwingen, wo 3 Tagesbewegungsmitte bedeutungslos ist. Antwortete am 23. Februar 16 um 13:12 Wir können Joe Celkos schmutzige linke äußere Verknüpfungsmethode anwenden (wie oben von Diego Scaravaggi zitiert), um die Frage zu beantworten, wie es gefragt wurde. Generiert die angeforderte Ausgabe: beantwortet Jan 9 16 bei 0:33 Ihre Antwort 2017 Stack Exchange, IncExponential gleitender Durchschnitt in T-SQL Exponentielle gleitende Durchschnitte ähneln gewichteten gleitenden Durchschnitten, indem sie weniger Gewicht auf Änderungen vor langer Zeit und mehr Gewicht zu vergeben Kürzliche Änderungen. Gewichtete Bewegungsdurchschnitte sind linear, aber exponentielle gleitende Durchschnitte sind exponentiell. Das heißt, das Gewicht kann als Kurve ausgedrückt werden: Es gibt eine großartige Möglichkeit, exponentielle gleitende Durchschnitte in T-SQL zu berechnen, indem ein undokumentiertes Merkmal über Variablen und laufende Summen in SQL Server verwendet wird. In diesem Blog-Post werde ich zeigen, wie man diese Methode verwendet, um exponentiellen gleitenden Durchschnitt in T-SQL zu berechnen, aber ich werde auch eine Methode, die Standard-Features in SQL Server verwendet. Leider bedeutet das mit einer Schleife. In den Beispielen berechne ich einen 9 Tage exponentiellen gleitenden Durchschnitt. Die Beispiele verwenden die Datenbank TAdb. Ein Skript zum Erstellen von TAdb finden Sie hier. Exponential Moving Average (EMA): Laufen Totals-Methode Die Theorie hinter den laufenden Total-Features in Updates wird ausführlich von Jeff Moden in seinem Artikel beschrieben, der die laufenden Total - und Ordinal-Rank-Probleme löscht. Andere Ressourcen, die mit dieser Methode beschreiben, um EMA zu berechnen, sind der Blog-Beitrag, der die Umschlagsdurchschnitte mit T-SQL von Gabriel Priester berechnet und die Forumspost Exponential Moving Average Challenge. Sowohl auf SQL Server Central. Grundsätzlich können Sie in T-SQL Variablen sowie Spalten in einer Update-Anweisung aktualisieren. Die Updates werden Zeile für Zeile intern von SQL Server ausgeführt. Dieses Zeilen-zu-Zeilen-Verhalten macht das Berechnen einer laufenden Summe möglich. Dieses Beispiel zeigt, wie es funktioniert: Beachten Sie, dass 8220ColumnRunningTotal8221 eine laufende Summe von 8220ColumnToSum8221 ist. Mit dieser Methode können wir EMA9 mit diesem T-SQL berechnen: Die Berechnung von EMA ist ziemlich einfach. Wir verwenden die aktuelle Zeile und die vorherige, aber mit mehr Gewicht auf die aktuelle Zeile. Das Gewicht wird nach der Formel 2 (19) berechnet, wobei 822098221 der Parameter für die Länge der EMA ist. Um die EMA9 für Zeile 10 oben zu berechnen, ist die Berechnung: In diesem Fall erhält die aktuelle Zeile 20 des Gewichts (2 (19) 0,2) und die vorherige Zeile erhält 80 des Gewichts (1-2 (19) 0,8). Sie finden diese Berechnungen in der obigen Anweisung in der CASE-Anweisung: Exponential Moving Average (EMA): Looping-Methode Soweit ich weiß, mit Ausnahme der laufenden Summen-Methode, die oben beschrieben wurde, gibt es keine Möglichkeit, EMA mit einer setbasierten SQL-Anweisung zu berechnen . Daher verwendet das T-SQL unten eine while-Schleife, um EMA9 zu berechnen: Die Ergebnisse sind die gleichen wie im laufenden Summenbeispiel oben. Leistung Wie erwartet, ist die setbasierte laufende Summenversion viel schneller als die Loop-Version. Auf meiner Maschine war die Set-basierte Lösung ca. 300 ms, im Vergleich zu etwa 1200 mit der Loop-Version. Die Loop-Version entspricht eher den SQL-Standards. Also die Wahl zwischen den Methoden hängt davon ab, was8217s wichtigste für Sie, Leistung oder Standards. Der exponentielle gleitende Durchschnitt kann in der Trendanalyse verwendet werden, wie bei den anderen Arten von gleitenden Durchschnitten, Simple Moving Average (SMA) und Weighted Gleitender Durchschnitt (WMA). Es gibt auch andere Berechnungen in der technischen Analyse, die die EMA, MACD zum Beispiel verwendet. Dieser Blog-Post ist Teil einer Serie über technische Analyse, TA, in SQL Server. Sehen Sie die anderen Beiträge hier. Geschrieben von Tomas Lind Tomas Lind - Beratungsdienstleistungen als SQL Server DBA und Datenbankentwickler bei High Coast Database Solutions AB.

No comments:

Post a Comment