flash123: SQL - Jede zwanzigste row auslesen?

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

  1. 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

    1. 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

      1. 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)

      2. 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

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. 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

  2. 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

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  3. 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

    1. 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)

      1. Was sagt EXPLAIN, wieviel Datensaetze sind drin? Ist [Aktienkennung] von einem Index abgedeckt?

        Ciao, Frank