SQL - Jede zwanzigste row auslesen?
flash123
- datenbank
Hallo,
ich speichere Aktienkurse in einer Datenbank. Für jeden Tag und jede Aktie ein Wert. Nun will ich beispielsweise einen Chart über 10 Jahre zeichnen und dafür natürlich nicht jeden Tag sondern nur jeden Monat einzeichnen. Gibt des eine Möglichkeit per SQL nur jede zwanzigste Row auszulesen oder immer nur den ersten Tag eines Monats auszusen?
Oder müsste ich schon beim einlesen ein Feld erstellen und dort für die jeweilige row vermerken ob es sich um den ersten eines Monats handelt?
Wer hat Erfahrung hiermit und kann mir einen Rat geben, wie ich das am besten umsetze?
Vielen Dank
Hallo,
ich speichere Aktienkurse in einer Datenbank.
Die Lösung Deines Problemes dürfte stark von der konkreten Datenbank und von der Implementierung Deiner Tabellen abhängen.
Das will ich aber nicht erraten.
Fred
Hallo,
ich speichere Aktienkurse in einer Datenbank.
Die Lösung Deines Problemes dürfte stark von der konkreten Datenbank und von der Implementierung Deiner Tabellen abhängen.
Das will ich aber nicht erraten.
Fred
Hallo,
es geht um eine MySQL-Datenbank. Die Tabelle ist folgendermaßen aufgebaut:
Jede row:
Aktienkennung - datum - preis
flash
Die Tabelle ist folgendermaßen aufgebaut:
Jede row:
Aktienkennung - datum - preis
Und wie ist Datum hinterlegt? Möglicherweise musst Du eine Hilfsspalte in derAbfrage bauen:
select CONCAT (MONTH(YEAR
),'-',MONTH(datum
) AS monat
, AVG(preis
) AS DPreis
, Aktienkennung
GROUP BY monat
(Suche bei Datumsfunktionen der Group-By-Order, da wirst Du fündig)
Hello,
es geht um eine MySQL-Datenbank. Die Tabelle ist folgendermaßen aufgebaut:
Jede row:
Aktienkennung - datum - preis
Welcher Preis? Einte Aktie hat mindestens einen Höchstpreis, Tiefstpreis und mittleren Preis am Tag...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi Tom
OPEN, CLOSE, HIGH, LO, MID/MEDIAN/MEAN und das ganze noch Trade-based.
Wenn nur ein Preis benutzt wird, bezieht es sich meistens auf den CLOSE Preis. Ist aber fuer den OP erstmal nebensaechlich, denn wenn er sein Chart mit einem Preis bauen kann, kann er es wahrschweinlich auch fuer mehrere Preise.
Cheers, Frank
Hello,
ich speichere Aktienkurse in einer Datenbank. Für jeden Tag und jede Aktie ein Wert. Nun will ich beispielsweise einen Chart über 10 Jahre zeichnen und dafür natürlich nicht jeden Tag sondern nur jeden Monat einzeichnen. Gibt des eine Möglichkeit per SQL nur jede zwanzigste Row auszulesen oder immer nur den ersten Tag eines Monats auszusen?
Sinnvoller wäre es doch sicherlich, unterschiedliche Kurven nach Höchstwerten, Mittelwerten, oder Tiefstwerten dieser zwanzig Tage anzeigen lassen zu können.
Und dazu könnte man gruppieren.
Oder man schreibt sich gleich eine benutzerdefinierte Funktion (in SQL!), die die Teilgruppierungen und ihre Aggretationen vornimmt.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi
ich speichere Aktienkurse in einer Datenbank. Für jeden Tag und jede Aktie ein Wert. Nun will ich beispielsweise einen Chart über 10 Jahre zeichnen und dafür natürlich nicht jeden Tag sondern nur jeden Monat einzeichnen. Gibt des eine Möglichkeit per SQL nur jede zwanzigste Row auszulesen oder immer nur den ersten Tag eines Monats auszusen?
jeden 20. Datensatz zu lesen duerfte voraussetzen, dass du eine durchgehende Nummerierung hast. Einfacher duerfte es fuer dich sein, anhand des Datums zu gruppieren/selektieren
in Prosa: Selektiere jeden Datensatz fuer jede Aktie wo das Datum dem kleinsten oder groessten Datum des jeweiligen Monats der gleichen Aktie entspricht.
SELECT *
FROM AktienPreise t
WHERE t.Datum = (SELECT MIN(Datum)
FROM AktienPreise t2
WHERE t2.Aktienkennung = t1.Aktienkennung
AND MONTH(t2.Datum) = MONTH(t.Datum)
AND YEAR(t2.Datum) = YEAR(t.Datum))
... so ungefaehr (mit Absicht nicht die Loesung auf dem Silbertablett)
Oder müsste ich schon beim einlesen ein Feld erstellen und dort für die jeweilige row vermerken ob es sich um den ersten eines Monats handelt?
Nein, das ergibt sich automatisch aus dem Datum. 01.03.2012 wird immer der erste Tag des Monats Maerz sein. :-) Fuer die Faelle, das der 1.3. ein Feiertag/Sonntag/Samstag ist, gibt es eben den Umweg mit der korrelierenden Unterabfrage)
Cheers, Frank
Hi
ich speichere Aktienkurse in einer Datenbank. Für jeden Tag und jede Aktie ein Wert. Nun will ich beispielsweise einen Chart über 10 Jahre zeichnen und dafür natürlich nicht jeden Tag sondern nur jeden Monat einzeichnen. Gibt des eine Möglichkeit per SQL nur jede zwanzigste Row auszulesen oder immer nur den ersten Tag eines Monats auszusen?
jeden 20. Datensatz zu lesen duerfte voraussetzen, dass du eine durchgehende Nummerierung hast. Einfacher duerfte es fuer dich sein, anhand des Datums zu gruppieren/selektieren
in Prosa: Selektiere jeden Datensatz fuer jede Aktie wo das Datum dem kleinsten oder groessten Datum des jeweiligen Monats der gleichen Aktie entspricht.
SELECT *
FROM AktienPreise t
WHERE t.Datum = (SELECT MIN(Datum)
FROM AktienPreise t2
WHERE t2.Aktienkennung = t1.Aktienkennung
AND MONTH(t2.Datum) = MONTH(t.Datum)
AND YEAR(t2.Datum) = YEAR(t.Datum))... so ungefaehr (mit Absicht nicht die Loesung auf dem Silbertablett)
Hi danke. Das sieht doch soweit richtig aus und funktioniert auch? Was ist daran nicht korrekt? (einziges Problem ist, dass es nicht ganz so schnell läuft -> 3 sek)
Was sagt EXPLAIN, wieviel Datensaetze sind drin? Ist [Aktienkennung] von einem Index abgedeckt?
Ciao, Frank