Wednesday 13 September 2017

Db2 Gleitenden Durchschnitt


Dies ist eine Evergreen Joe Celko Frage. Ich ignoriere, welche DBMS-Plattform verwendet wird. Aber auf jeden Fall Joe war in der Lage, mehr als 10 Jahren mit Standard-SQL zu beantworten. Joe Celko SQL-Puzzles und Antworten Zitat: Der letzte Update-Versuch deutet darauf hin, dass wir das Prädikat verwenden können, um eine Abfrage, die uns einen gleitenden Durchschnitt geben würde: Ist die zusätzliche Spalte oder die Abfrage Ansatz besser Die Abfrage ist technisch besser, weil die UPDATE-Ansatz wird Denormalisierung der Datenbank. Wenn jedoch die historischen Daten, die aufgezeichnet werden, sich nicht ändern und die Berechnung des gleitenden Durchschnitts kostspielig ist, könnten Sie die Verwendung des Spaltenansatzes in Erwägung ziehen. SQL Puzzle-Abfrage: mit allen Mitteln einheitlich. Sie werfen nur auf den entsprechenden Gewichtskorb je nach Entfernung vom aktuellen Zeitpunkt. Zum Beispiel quottake Gewicht1 für Datenpunkte innerhalb von 24 Stunden von aktuellen Datenpunkt Gewicht0,5 für Datenpunkte innerhalb von 48hrsquot. In diesem Fall ist es wichtig, wieviel aufeinander folgende Datenpunkte (wie 6:12 Uhr und 11:48 Uhr) voneinander entfernt sind. Ein Anwendungsfall, den ich mir vorstellen kann, wäre ein Versuch, das Histogramm zu glätten, wo Datenpunkte nicht dicht genug sind. Ndash msciwoj Mai 27 15 at 22:22 Im nicht sicher, dass Ihr erwarteten Ergebnis (Ausgang) zeigt klassische einfache bewegen (rolling) Durchschnitt für 3 Tage. Denn zum Beispiel gibt das erste Dreibettzimmer von Zahlen per Definition: aber man erwartet 4.360 und seine Verwirrung. Trotzdem schlage ich die folgende Lösung vor, die die Fensterfunktion AVG verwendet. Dieser Ansatz ist viel effizienter (klarer und weniger ressourcenintensiv) als SELF-JOIN in anderen Antworten eingeführt (und ich bin überrascht, dass niemand eine bessere Lösung gegeben hat). Sie sehen, dass AVG wird mit Fall verpackt, wenn rownum gt p. days dann zu zwingen, NULL s in ersten Zeilen, wo 3 Tage Moving Average ist sinnlos. Beantwortet Joe Celkos dirty linken äußeren Join-Methode (wie zitiert von Diego Scaravaggi) auf die Frage zu beantworten, wie es gefragt wurde. Erstellt die angeforderte Ausgabe: beantwortet Jan 9 16 at 0:33 Ihre Antwort 2017 Stack Exchange, IncDie Nachfrage Trend von Job-Anzeigen zitiert DB2 als Anteil aller IT-Aufträge mit einem Spiel in der Datenbank amp Business Intelligence Kategorie. DB2 Gehaltstabelle Diese Grafik zeigt den dreimonatigen gleitenden Durchschnitt für Gehälter, die in dauernden IT-Arbeitsplätzen zitiert werden. DB2 Salary Histogramm Diese Tabelle bietet ein Gehalt Histogramm für IT-Arbeitsplätze zitiert DB2 über die 3 Monate bis 13 Januar 2017 innerhalb Großbritanniens. DB2 Top 30 Job Locations Die nachstehende Tabelle zeigt die Nachfrage und stellt einen Leitfaden für die in den IT-Jobs zitierten mittleren Gehälter für die DB2 innerhalb des Vereinigten Königreichs in den drei Monaten bis zum 13. Januar 2017 dar. Die Spalte Rangänderung gibt Anzeichen für die Veränderung der Nachfrage Innerhalb jedes Standortes auf der Grundlage der gleichen 3 Monate Zeitraum im vergangenen Jahr. Rank Change auf die gleiche Zeit Letztes Jahr Matching Permanent IT Job-Anzeigen Median Gehalt Letzte 3 MonateErfahren Sie die reiche Welt der SQL-OLAP-Funktionen - Moving Averages von George Baklarz Erkunden Sie die reiche Welt der SQL-OLAP-Funktionen - Moving Averages (redaktionelle Note des Inhalts Ausschusses: die meisten Von dem, was in dem Artikel ist plattformübergreifend, mit Ausnahme der Beispiele von LAGLEAD und FIRSTVALUELASTVALUE sind nicht verfügbar in DB2 für zOS) Schade der schlechte Entwickler oder Endbenutzer, der nie die Chance hatte, echte SQL verwenden. Sie wissen, die Art von SQL, die mehr als wählen Sie ein paar Zeilen mit möglicherweise ein paar Prädikate in Well geworfen, können einige sagen, dass es eine gute Sache, nicht zu wissen, die Details hinter SQL Allerdings wissen, einige der anspruchsvollen Gruppierung , Bestellung und Sortierung Optionen von SQL könnte Ihr Leben einfacher, und vielleicht sogar Ergebnis in schneller Ergebnisse. Die Expanding SQL-Syntax Die SQL-Sprache ist reich an Funktionalität und kann oft komplex zu navigieren. Wie gelangten wir zu diesem Punkt in der Sprache aus unseren einfachen INSERT-, UPDATE-, DELETE - und SELECT-Anfängen Frühe relationale Datenbanksysteme fehlten analytische Fähigkeiten - zum Beispiel die Fähigkeit, Standardabweichung zu berechnen oder gleitende Mittelwerte zu generieren. Diese Art der Berechnung wurde typischerweise entweder in einer Tabellenkalkulation oder einer Anwendung durchgeführt. Es gibt eine große Anzahl von Produkten auf dem Markt, die ihre eigenen Cubes und Berichte generieren, indem sie Daten aus einer Datenbank extrahieren (und oft mit einigen sehr schlechten Extraktionstechniken). Ausführen von Berichten lokal auf einer Arbeitsstation führte zu zwei großen Engpässen: Übertragen großer Datenmengen auf ein Workstation über ein begrenztes Netzwerk Berechnungsintensive Berechnungen auf langsamen Prozessoren mit wenig Speicher und Festplatte Abgesehen von dem Hinzufügen von mehr Reichtum auf die SQL-Sprache, die Fähigkeit Um CUBEs und Zusammenfassungsinformationen auf der Datenbankebene zu generieren, haben dazu beigetragen, die Leistung auf eine Reihe von Wegen zu verbessern: Der größere Server, auf dem die Datenbank war, war effizienter bei der Berechnung der Cubes, Zusammenfassungen und anderer Berechnungen, die von der Workstation angefochten wurden Lokal für den Prozessor, so dass keine unnötige Übertragung von Daten erforderlich war, bei der Berechnung des Ergebnisses Nur die endgültigen berechneten Zeilen würden an die Anwendung zurückgegeben Natürlich würden einige DBAs unter uns auch darauf hinweisen, dass diese neue Fähigkeit erhöht die Menge an Kopfschmerzen, die sie haben Beschäftigen, weil der über-enthusiastisch SQL-Fanatiker, die nicht einen Anhaltspunkt über Indizes und Optimierung haben wir manchmal vergessen, dass die DB2-Datenbank-Engine kann eine Menge Arbeit in unserem Namen anstatt sich auf unsere Lieblings-Tabelle, um einige dieser Werte zu berechnen. Sie können feststellen, dass mit diesen Funktionen können Sie Ihre Berichterstattung beschleunigen. Oder Sie können Ihre engen Freunde mit Ihrer Fähigkeit, komplexe OLAP-OLAP-Funktionen (OLAP) zu schreiben, beeindrucken, die eine Vielzahl von Funktionen bereitstellen, einschließlich der Möglichkeit, ein Ranking zurückzugeben, Zeilennummerierung und Spaltenfunktionen zu ändern, um einen Bereich von Werten zu analysieren Innerhalb einer Spalte statt der gesamten Ergebnismenge. Typischerweise kann eine OLAP-Funktion in Ausdrücken in einer Auswahlliste oder der ORDER BY-Klausel einer select-Anweisung enthalten sein. Zwar gibt es viele OLAP-Funktionen innerhalb DB2 gefunden, werden wir auf gleitende Durchschnitte zu betrachten und wie Sie sie nutzen können. Bevor wir in die Details der OLAP-Funktionen gelangen, müssen wir eine Tabelle und einige Beispieldaten erstellen. Im folgenden Beispiel wird davon ausgegangen, dass Sie eine Verbindung zu der SAMPLE-Datenbank haben, die normalerweise für Sie in einer DB2 für Linux-, Unix - und Windows-Installation generiert wird. Hinweis: Die SQL-Beispiele, die in diesem Artikel gefunden werden, stehen Ihnen als Download-Textdatei zur Verfügung. Nichts ist schlimmer als die Eingabe in einem Satz von SQL und es scheitern aufgrund eines fehlenden Komma oder falsch geschriebenen Spaltennamen. Eine Verknüpfung zur Datei wird am Ende des Artikels bereitgestellt. Zuerst müssen wir die STOCKS-Tabelle erstellen, die das Aktiensymbol (SYMBOL), das Handelsdatum (TRADINGDATE) und den Schlusskurs für den Bestand am Ende des Tages (CLOSEPRICE) enthält. Drop-Tabellenbestände erzeugen Tabellenbestände (Das folgende SQL verwendet Rekursion, um Daten für die STOCKS-Tabelle mit nur einem Bestand (IDUG) zu erzeugen. Der Aktienkurs ist zu Beginn des Jahres 100 und dann für jeden Tag bis zu einem Wert von 1 erhöht 10. Januar Die Zahlen wurden einfach gehalten, so dass Sie sehen können, wie die Berechnungen in den Beispielen durchgeführt werden: Legen Sie in Werte mit temp1 (nm, tx, s1) als Werte (IDUG, Datum (2015-01-01), 100 ) Wählen Sie IDUG, tx 1 Tag, s11 wobei tx lt Datum (2015-01-10) aus temp1 wählen Wenn Sie Zufallszahlen für Ihre Bestände generieren möchten, können Sie die SELECT-Anweisung so ändern, dass sie die folgende CASE-Anweisung enthält: SELECT IDUG, TX 1 DAY, S1 CASE WHEN RAND () gt .50 DANN INT (-10RAND ()) ELSE INT (10 RAND ()) Die Daten in der Tabelle sind unten dargestellt AUSWÄHLEN VON STOCKS SYMBOL TRADINGDATE CLOSEPRICE IDUG 2015-01- 01-00.00.00 100 IDUG 2015-01-02-00.00.00 101 IDUG 2015-01-03-00.00.00 102 IDUG 2015-01-04-00.00.00 103 IDUG 2015-01-05-00.00.00 104 IDUG 2015-01-06-00.00.00 105 IDUG 2015-01-08-00.00.00 107 IDUG 2015-01-09-00.00.00 108 IDUG 2015-01-10 -00.00.00 109 30-Tage-Gleitender Durchschnitt Wir beginnen mit einer gleitenden Durchschnittsberechnung. Gleitende Mittelwerte erlauben uns, eine geglättete Kurve von Datenpunkten zu betrachten. Es gibt immer Spikes in Datenwerten, vor allem mit Daten, die mit der Börse verbunden sind. Die Verschiebung von Durchschnitten kann uns einen besseren Überblick über den langfristigen Trend der Daten geben, anstatt einzelne Datenpunkte zu betrachten. Das allgemeine Format eines gleitenden Durchschnitts beinhaltet die Verwendung von drei Operatoren innerhalb der SQL-Anweisung: OVER, PARTITION und ROWS ZWISCHEN hellip PRECEINGING und CURRENT ROW. OVER Die OVER-Funktion wird in Verbindung mit einer Funktion wie AVG verwendet. Das OVER-Schlüsselwort weist DB2 an, die durchschnittliche (oder andere Funktion) über einen Bereich von Werten zu berechnen. Wir können eine Partition (d. h. ein Aktiensymbol) angeben, die uns mitteilt, welche Spalte verwendet wird, um den gleitenden Durchschnitt zu stoppen. PARTITION Die Partitionsklausel wird während der Verarbeitung verwendet, um die Berechnung zu begrenzen. Eine Partition kann von einem Fenster in die Daten gedacht werden, auf die die Funktion angewendet wird. Im Beispiel werden wir die Spalte STOCK als Partition verwenden. Grundsätzlich bedeutet dies, dass jeder Aktienwert in der Tabelle einen eigenen gleitenden Durchschnittswert haben wird. Wenn Sie eine Partition nicht angeben, werden alle Werte in der Tabelle verwendet, unabhängig vom Stock-Symbol. ORDER BY ORDER BY muss innerhalb der OVER-Klausel angegeben werden, damit die Daten für die ROWS-Funktion bestellt werden. Sie können die gleichen Partitionierungsergebnisse erhalten, indem Sie ORDER BY partitionspalte, ordering column angeben. ROWS ZWISCHEN x PRECEDING UND CURRENT ROW Dies ist die Klausel, die DB2 angibt, welche Werte bei der Berechnung des Durchschnittswerts verwendet werden sollen. Das SQL gibt die Anzahl der Zeilen vor (PRECEDING) aus der aktuellen Zeile an. Also, wenn wir einen 30-Tage gleitenden Durchschnitt wollen, würden wir ZWISCHEN 29 PRECEDING und CURRENT ROW angeben. Nun, da wir die Grundlagen einer gleitenden Durchschnittsberechnung haben, ist hier das SQL, das uns den 30 Tage gleitenden Durchschnitt unserer Stammtabelle gibt: 1 MIT V1 (SYMBOL, TRADINGDATE, MOVINGAVG) AS 3 SELECT SYMBOL, TRADINGDATE, 4 AVG (CLOSEPRICE) 5 OVER (6 PARTITION BY SYMBOL 7 ORDER BY TRADINGDATE 8 Reihen zwischen 29 vor und CURRENT ROW 11 WHERE SYMBOL IDUG 12) 13 SELECT SYMBOL, TRADINGDATE, DEC (MovingAvg, 5,2) von V1 14 ORDER BY SYMBOL, TRADINGDATE Der erste Teil der SQL erstellt eine temporäre Tabelle namens V1, die das Aktiensymbol, das Handelsdatum und die gleitenden Durchschnittswerte enthält. Diese Berechnungen werden innerhalb des Körpers der WITH-Anweisung durchgeführt. 1 MIT V1 (SYMBOL, TRADINGDATE, MovingAvg) AS 13 SELECT SYMBOL, TRADINGDATE, DEC (MovingAvg, 5,2) FROM 14 ORDER V1 durch das Symbol, TRADINGDATE Die SELECT-Anweisung nach der WITH-Klausel ruft alle Daten aus der temporären Tabelle. Sie können immer eine BETWEEN-Klausel hinzufügen, um die Ergebnisse auf einen bestimmten Datenbereich zu beschränken. WHERE TRADINGDATE ZWISCHEN 2015-01-01 UND 2015-01-10 Die eigentliche Arbeit findet innerhalb der WITH-Klausel statt. 3 SELECT SYMBOL, TRADINGDATE, 4 AVG (CLOSEPRICE) 5 OVER (6 PARTITION BY SYMBOL 7 ORDER BY TRADINGDATE 8 Reihen zwischen 29 vor und CURRENT ROW 11 WHERE SYMBOL IDUG Die durchschnittliche Funktion (AVG) wird auf die CLOSEPRICE Säule angewendet werden. Die OVER-Funktion legt Folgendes fest: Die Partition basiert auf dem Bestandssymbol (denken Sie daran, wie Pausen bei der Verarbeitung eines Durchschnitts auftreten würden). Die Reihenfolge der Zeilen sollte nach Handelsdatum erfolgen, damit wir die Zeilen in der richtigen Reihenfolge haben Reihenfolge für den gleitenden Durchschnitt Der Durchschnitt sollte die 29 vorangegangenen Zeilen aus der aktuellen verarbeiteten Zeile (für insgesamt 30 Tage) berücksichtigen. Die FROM-Klausel wählt die spezifischen Bestandswerte aus, die wir verfolgen möchten Beispiel und wir würden gleitende Durchschnittswerte für alle Bestände in der Tabelle erhalten. Beim Ausführen der Abfrage gegen unsere Testtabelle wird das folgende Ergebnis generiert: SYMBOL TRADINGDATE 3 IDUG 2015-01-01-00.00.00 100.00 IDUG 2015-01-02-00.00 100,00 IDUG 2015-01-03-00.00.00 101,00 IDUG 2015-01-04-00.00.00 101,50 IDUG 2015-01-05-00.00.00 102.00 IDUG 2015-01-06-00.00.00 102.50 IDUG 2015- 01-07-00.00.00 103.00 IDUG 2015-01-08-00.00.00 103.50 IDUG 2015-01-09-00.00.00 104.00 IDUG 2015-01-10-00.00.00 104.50 Sie könnten einen zusätzlichen Twist der Auswahl hinzufügen Anweisung, um das Delta zwischen dem gleitenden Durchschnitt und dem ursprünglichen Wert anzuzeigen. MIT V1 (SYMBOL, TRADINGDATE, MovingAvg) AS SELECT SYMBOL, TRADINGDATE, AVG (CLOSEPRICE) OVER (PARTITION BY SYMBOL ORDER BY TRADINGDATE Reihen zwischen 29 vor und CURRENT ROW V2 (SYMBOL, TRADINGDATE, ORIGINAL, MovingAvg, DELTA) AS SELECT S. SYMBOL, S. TRADINGDATE, S. CLOSEPRICE, aus V1, STOCKS S WHERE V1.SYMBOLS. SYMBOL UND V1.TRADINGDATES. TRADINGDATE SELECT SYMBOL, TRADINGDATE, ORIGINAL, MovingAvg, DELTA VON V2 ORDER BY SYMBOL, TRADINGDATE Es gibt viele Möglichkeiten zu generieren Diese Ergebnisse, aber eine WITH-Anweisung ist eine bequeme Art und Weise der Aufbau der SQL, die wir ausführen möchten. Die Ergebnisse veranschaulichen, wie unser Durchschnitt wird über den Bereich der Werte berechnet werden. Website, .00 100 100,00 0,00 IDUG 2015-01-02-00,00.00 101 100,50 0,50 IDUG 2015-01-03-00.00.00 102 101,00 1.00 IDUG 2015-01-04-00.00.00 103 101,50 1.50 IDUG 2015-01-05 -00.00.00 104 102.00 2.00 IDUG 2015-01-06-00.00.00 105 102.50 2.50 IDUG 2015-01-07-00.00.00 106 103.00 3.00 IDUG 2015-01-08-00.00.00 107 103.50 3.50 IDUG 2015-01 -09-00.00.00 108 104.00 4.00 IDUG 2015-01-10-00.00.00 109 104.50 4.50 Einige von Ihnen haben sich vielleicht gefragt, wie wir einen bewegten 30-Tage-Durchschnitt haben können, wenn unsere Daten tatsächlich nicht enthalten 30 Tage Daten vor dem Aktuelle Zeile. In dem vorherigen Ergebnis, werden Sie feststellen, dass der erste Januar hat einen Durchschnitt von 100, da gab es nur einen Wert beteiligt. Die 2. hat einen Durchschnitt von 100.50, weil unsere insgesamt 201 für die beiden Tage und dann durch zwei geteilt. So ist die OVER-Funktion intelligent genug, um einen gleitenden Durchschnitt zu erstellen, basierend auf den Werten, die für die Funktion verfügbar sind. Die folgenden Ergebnisse verwenden einen 5 Tage gleitenden Durchschnitt, was zeigt, dass die durchschnittliche Funktion auf 5 Tage begrenzt ist. Das Delta ist immer 2 nach dem 5. Tag. SYMBOL TRADINGDATE ORIGINAL MOVINGAVG DELTA IDUG 2015-01-01-00.00.00 100 100,00 0,00 IDUG 2015-01-02-00.00.00 101 100,50 0,50 IDUG 2015-01-03-00.00.00 102 101,00 1.00 IDUG 2015-01-04 -00.00.00 103 101.50 1.50 IDUG 2015-01-05-00.00.00 104 102.00 2.00 IDUG 2015-01-06-00.00.00 105 103.00 2.00 IDUG 2015-01-07-00.00.00 106 104.00 2.00 IDUG 2015-01 -08-00.00.00 107 105.00 2.00 IDUG 2015-01-09-00.00.00 108 106.00 2.00 IDUG 2015-01-10-00.00.00 109 107.00 2.00 Die Funktion LAGLEAD Es gibt Situationen, in denen die Daten NULL-Werte enthalten können und Ist darauf zu achten, wie diese Werte bei der Berechnung des gleitenden Durchschnitts verwendet werden. Werden NULL-Werte als Nullen behandelt, oder sollte unser gleitender Durchschnitt sie aus unserer Durchschnittsberechnung eliminieren, wird die folgende UPDATE-Anweisung den 3. Januar setzen. 4 th. Und 10. Wochenende Werte der Aktie auf Null. 1. Januar wurde als 100 gehalten, da das der Ausgangspunkt für die Erzeugung aller Werte war. SET CLOSEPRICE NULL WHERE TRADINGDATE IN (2015-01-03,2015-01-04,2015-01-10) Die erneute Ausgabe der 5-Tage gleitenden durchschnittlichen Abfrage gibt einige interessante Ergebnisse. SYMBOL TRADINGDATE ORIGINAL MovingAvg DELTA IDUG 2015-01-01-00.00.00 100 100,00 0,00 IDUG 2015-01-02-00.00.00 101 100,50 0,50 IDUG 2015-01-05-00.00.00 104 101,67 2,33 IDUG 2015.01.06 -00.00.00 105 103.33 1.67 IDUG 2015-01-07-00.00.00 106 105.00 1.00 IDUG 2015-01-08-00.00.00 107 105.50 1.50 IDUG 2015-01-09-00.00.00 108 106.00 2.00 Die gleitende Durchschnittsfunktion Verwendet nur NULL-Werte, um den gleitenden Durchschnitt zu bestimmen. Für Bestandswerte, die an einem bestimmten Tag null sind, werden alle Nichtnullwerte addiert und durch die Anzahl von Nicht-Nullwerten dividiert. Zum Beispiel wird der gleitende Durchschnitt auf dem 10. berechnet als: Es wird Situationen geben, in denen die Aktienkurve kontinuierlich sein soll (auch wenn es keinen Handel an einem Urlaub oder Wochenende gab). In solchen Fällen möchten Sie den NULL-Schlusskurs auf den letzten gültigen Schlusskurs geändert haben. Anstatt unsere Daten zu modifizieren, können wir die LAG-Funktion verwenden, um vorherige Werte zu erhalten, die in einer Berechnung verwendet werden. Die LAG-Funktion hat folgende Syntax: LAG (oder LEAD) (Spalte, Offset, Standardwert, RESPECT NULLS IGNORE NULLS) Spalte Dieses Feld ist entweder der Name der Spalte, von der der Wert abhängt, oder ein Ausdruck, der den Namen des Spalte darin. Offset Die LAG-Funktion liefert den Wert für die Zeile, die versetzt ist, n Anzahl der Zeilen vor der aktuellen Zeile. Ein Wert von Null wäre die aktuelle Zeile, 1 wäre die vorherige Zeile und so weiter. Der Standardwert für Offset ist 1. Standardwert Der Standardwert wird für den Fall verwendet, dass eine Zeile nicht am Offset vorhanden ist (d. h. nach der letzten Zeile oder vor der ersten Zeile). Beispielsweise würde für die erste Zeile in unserer Tabelle ein Offset von 1 nicht existieren, so dass dieser Standardwert stattdessen verwendet würde. Der Standardwert ist null. Nulls Sie können festlegen, wie NULLS bei der Verarbeitung der Werte behandelt werden sollen. Wenn IGNORE NULLS angegeben wird, werden alle Zeilen mit Nullwerten während der Berechnung ignoriert. Wenn RESPECT NULLS verwendet wird, werden NULLs berücksichtigt. Die LEAD-Funktion ist identisch mit der LAG-Funktion, aber die Werte werden aus den folgenden Zeilen genommen, im Gegensatz zu den vorherigen. Im folgenden SQL wird eine Zwischenergebnismenge erstellt, die die Nullwerte mit dem letzten gültigen Schlusskurs füllt. Die COALESCE-Funktion gibt das erste non-null-Ergebnis in einer Liste zurück. Wenn der Bestandswert vorhanden ist, wird sein Wert von der Funktion zurückgegeben. Andernfalls verwenden wir die LAG-Funktion, um den ersten Nicht-Nullwert in der Tabelle vor der aktuellen Zeile zu finden. MIT V1 (SYMBOL, TRADINGDATE, EODVALUE) ALS SELECT SYMBOL, TRADINGDATE, LAG (CLOSEPRICE, 1, CAST (NULL AS INT), IGNORE NULLS) ÜBER (PARTITION DURCH SYMBOL-ORDNUNG VON TRADINGDATE

No comments:

Post a Comment