Moving Average Function In Sql


In diesem Beitrag zeige ich einen Trick, um die gleitende Durchschnittsberechnung durchzuführen (kann auf andere Operationen erweitert werden, die Fensterfunktionen erfordern), die super schnell ist. Häufig müssen SAS-Analytiker eine gleitende Durchschnittsberechnung durchführen und es gibt mehrere Optionen nach der Reihenfolge der Präferenz: 1. PROC EXPAND 2. DATENSCHRITT 3. PROC SQL Aber viele Websites können SASETS nicht zur Nutzung von PROC EXPAND und zum Durchführen von gleitendem Durchschnitt in DATEN lizenzieren STEP erfordert eine Codierung und ist fehleranfällig. PROC SQL ist eine natürliche Wahl für Junior-Programmierer und in vielen Business-Fällen die einzige Lösung, aber SAS39s PROC SQL fehlt Fenster-Funktionen, die in vielen DBs verfügbar sind, um gleitende durchschnittliche Berechnung zu erleichtern. Eine Technik, die Menschen in der Regel verwenden, ist CROSS JOIN, das ist sehr teuer und nicht eine tragfähige Lösung für auch mittelgroße Datensätze. In diesem Beitrag zeige ich einen Trick, um die gleitende Durchschnittsberechnung durchzuführen (kann auf andere Operationen erweitert werden, die Fensterfunktionen erfordern), die super schnell ist. Man betrachte die einfachste gleitende Durchschnittsberechnung, wo die nachfolgenden K-Beobachtungen in die Berechnung einbezogen werden, nämlich MA (K), hier setzen wir K5. Zuerst erzeugen wir 20 Obsample-Daten, wobei die Variablen-ID für das Fenstering verwendet werden soll und die Variable X für die MA-Berechnung verwendet wird. Anschließend wenden wir den Standard CROSS JOIN an, um zuerst die resultierenden Daten, nicht gruppiert, zu untersuchen Um zu verstehen, wie die Datenstruktur genutzt werden kann. Aus dem resultierenden Datensatz ist es schwer, einen Anhaltspunkt zu finden, jetzt let39s sortieren durch quotbidquot Spalte in diesem Datensatz: Von diesen sortierten Daten ist es klar, dass wir tatsächlich don39t haben, CROSS JOIN den gesamten ursprünglichen Datensatz, Können wir einen Quotequotdatensatz erzeugen, der den Differenzwert enthält und den ursprünglichen Datensatz CROSS JOIN mit diesem viel kleineren Quottendatensatz setzen und alle Daten, die wir für die MA-Berechnung verwenden müssen, dort sein werden. Nun let39s tun es: CROSS JOIN ursprünglichen Daten mit quot Operationquot-Daten, sortieren nach (a. idops), die eigentlich quotbid39 in sortierten Datensatz Beachten Sie, dass in obigen Code ist es notwendig, ax multiplizieren mit b. weight, so dass die Daten Kann zwischengeschleift werden, da sonst der gleiche X-Wert aus der ursprünglichen Tabelle ausgegeben wird und die MA-Berechnung fehlgeschlagen ist. Die explizite Gewichtsvariable fügt der gesamten MA-Berechnung tatsächlich mehr Flexibilität hinzu. Beim Festlegen von 1 für alle obs-Ergebnisse in einer einfachen MA-Berechnung, zuweisen, verschiedene Gewichte wird dazu beitragen, komplexere MA-Computing, wie z. B. geben weitere Beobachtungen weniger Gewicht für ein zerlegtes MA. Wenn unterschiedliche K-Parameter in MA (K) Berechnungen erforderlich sind, muss nur der Betriebsdatensatz aktualisiert werden, was trivialer Job ist. Nun ist die eigentliche Code-Vorlage für MA (K) Berechnung: Mit dieser neuen Methode ist es interessant, sie mit dem teuren Self CROSS JOIN sowie PROC EXPAND zu vergleichen. Auf meiner Workstation (Intel i5 3.8Ghz, 32GB Speicher, 1TB 72K HDD) ist selbst CROSS JOIN prohibitiv lang in der Laufzeit (wenn die Daten groß sind), während die neue Methode nur 2X so viel Zeit wie PROC EXPAND verwendet, sind beide Zeitaufwendungen Trivial Vergleich mit Self CROSS JOIN. Der unten gezeigte Zeitverbrauch ist in Sekunden angegeben. Unten können die Code-Leser laufen und vergleichen Sie sich. Verfasst am 10. Mai 2015 von Liang Xie SAS Programmierung für Data MiningMoving Durchschnitt in T-SQL Eine gängige Berechnung in der Trendanalyse ist der bewegte (oder rollende) Durchschnitt. Ein gleitender Durchschnitt ist der Durchschnitt der letzten 10 Zeilen. Der gleitende Durchschnitt zeigt eine glattere Kurve als die tatsächlichen Werte, mehr also mit einer längeren Periode für den gleitenden Durchschnitt, was es zu einem guten Werkzeug für die Trendanalyse macht. Dieser Blogpfosten zeigt, wie man den gleitenden Durchschnitt in T-SQL berechnet. Abhängig von der Version von SQL Server werden unterschiedliche Methoden verwendet. Die nachstehende Tabelle zeigt den Glättungseffekt (rote Linie) mit einem 200 Tage gleitenden Durchschnitt. Die Aktienkurse sind die blaue Linie. Der langfristige Trend ist deutlich sichtbar. T-SQL Moving Avergage 200 Tage Die folgende Demonstration benötigt die TAdb-Datenbank, die mit dem hier befindlichen Skript erstellt werden kann. Im nächsten Beispiel wird ein gleitender Durchschnitt für die letzten 20 Tage berechnet. Abhängig von der Version von SQL Server gibt es eine andere Methode, um die Berechnung durchzuführen. Und, wie wir später sehen werden, haben die neueren Versionen von SQL Server Funktionen, die eine viel effektivere Berechnung ermöglichen. SQL Server 2012 und höher Moving Average Diese Version verwendet eine aggregierte Fensterfunktion. Was ist neu in SQL 2012 ist die Möglichkeit, die Größe des Fensters zu beschränken, indem Sie angeben, wie viele Zeilen vor dem Fenster enthalten sollten: Zeilen vorangegangen ist 19, weil wir die aktuelle Zeile auch in die Berechnung enthalten. Wie Sie sehen können, ist die Berechnung der gleitenden Durchschnitt in SQL Server 2012 ziemlich einfach. Die Abbildung unten zeigt das Fensterprinzip. Die aktuelle Zeile ist mit gelb markiert. Das Fenster ist blau markiert. Der gleitende Durchschnitt ist einfach der Durchschnitt von QuoteClose in den blauen Linien: T-SQL Moving Average Fenster. Die Ergebnisse der Berechnungen in älteren Versionen von SQL Server sind identisch, so dass sie nicht erneut angezeigt werden. SQL Server 2005 8211 2008R2 Moving Average Diese Version verwendet einen gemeinsamen Tabellenausdruck. Der CTE wird selbst referenziert, um die letzten 20 Zeilen für jede Zeile zu erhalten: Moving Average vor SQL Server 2005 Die pre 2005-Version wird eine linke äußere Verknüpfung zu der gleichen Tabelle verwenden, um die letzten 20 Zeilen zu erhalten. Die äußere Tabelle kann gesagt werden, um das Fenster zu enthalten, die wir durchschnittlich auf berechnen wollen: Leistung Vergleich Wenn wir die drei verschiedenen Methoden gleichzeitig und überprüfen Sie die resultierende Ausführungsplan laufen, gibt es einen dramatischen Unterschied in der Leistung zwischen den Methoden: Vergleich von drei Verschiedene Methoden, um den gleitenden Durchschnitt zu berechnen Wie Sie sehen können, macht die Verbesserung der Fensterfunktion in SQL 2012 einen großen Unterschied in der Leistung. Wie bereits am Anfang dieses Beitrags erwähnt, werden gleitende Durchschnittswerte als Trends verwendet. Ein gemeinsamer Ansatz besteht darin, Bewegungsdurchschnitte verschiedener Längen zu kombinieren, um Veränderungen in der kurz-, mittel - und langfristigen Entwicklung zu erkennen. Von besonderem Interesse sind die Übergänge der Trendlinien. Zum Beispiel, wenn sich der kurze Trend über den langen oder mittleren Trend bewegt, kann dieser als Kaufsignal in der technischen Analyse interpretiert werden. Und wenn sich der kurze Trend unter einer längeren Trendlinie bewegt, kann dies als Verkaufssignal interpretiert werden. Die folgende Tabelle zeigt Quotes, Ma20, Ma50 und Ma200. T-SQL Ma20, Ma50, Ma200 kaufen und verkaufen Signale. Dieser Blog-Beitrag ist Teil einer Serie über technische Analyse, TA, in SQL Server. Siehe die anderen Beiträge hier. Geschrieben von Tomas Lind Ich arbeite mit SQL Server 2008 R2, versucht, einen gleitenden Durchschnitt zu berechnen. Für jeden Datensatz meiner Ansicht möchte ich die Werte der 250 vorherigen Datensätze sammeln und dann den Durchschnitt für diese Selektion berechnen. Meine Ansichtsspalten sind wie folgt: TransactionID ist eindeutig. Für jede TransactionID. Ich möchte den Durchschnitt für Spaltenwert über 250 Datensätze berechnen. So für die TransactionID 300, sammeln Sie alle Werte aus früheren 250 Zeilen (Ansicht wird absteigend nach TransactionID sortiert) und dann in Spalte MovAvg das Ergebnis des Mittelwerts dieser Werte schreiben. Ich bin auf der Suche, um Daten in einer Reihe von Datensätzen zu sammeln. Gefragt 28. Oktober 14 um 20:58 Uhr

Comments