Andreas-123: MIN() - Frage - Extremwert finden

Hallo!

In meiner MySQL-Tabelle stehen ziemlich viele Temperaturwerte. Jede Minute ein Wert.
Jetzt hätte ich gern den niedrigsten Wert, ab 'jetzt' 1 Jahr zurück gerechnet.

Ein Tabelleneintrag sieht als Beispiel so aus:

my_table

+------------+---------------------+
| Temperatur | DatumZeit          |
+------------+---------------------+
| 0.2        | 2009.01.01 12:00:00 |
+------------+---------------------+

Mein Versuch die niedrigste Temperatur zu ermitteln war

SELECT MIN(Temperatur) FROM my_table WHERE DatumZeit > NOW() -INTERVAL 1 YEAR

Der ausgegebene Wert sollte, in Erinnerung an die letzten Wochen, deutlich im zweistelligen Bereich liegen.
Im Moment ist es aber z.B. -0.2.

Wo liegt die Ursache für das abweichende Ergebnis von der Erwartung?
Was kann ich machen um mein gewünschtes Ergebnis zu bekommen?

Ich hoffe ich konnte alles verständlich erklären.

Danke für Hilfe!

Andreas

  1. Hello,

    Wo liegt die Ursache für das abweichende Ergebnis von der Erwartung?

    interessante Frage - welche Datentypen haben deine Spalten? Vielleicht liegt es an einem unpassenden Datentyp...

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    We found ourselves looking upon a familiar sight. We were home. How do you pick up the threads of an old life? How do you go on... when in your heart you begin to understand... there is no going back? There are somethings that time cannot mend... some hurts that go too deep... that have taken hold.  --  The Lord of the Rings: The Return of the King (Peter Jackson)
    1. Wo liegt die Ursache für das abweichende Ergebnis von der Erwartung?
      interessante Frage - welche Datentypen haben deine Spalten? Vielleicht liegt es an einem unpassenden Datentyp...

      Jetzt wirds aber peinlich. Ich habe sonst viel mit phpMyAdmin gearbeitet, das steht mir auf dem Server aber nicht zur Verfügung. Leider kenn ich den Befehl zur Abfrage des Datentyps nicht um ihn mir jetzt per Script anzeigen lassen zu können. Ich find auf die schnelle auch grad nichts im Handbuch. Hilfe?

      Das Datum ist ein gültiges MySQL-Datums-Format.
      Da bin ich mir sicher, weil ich auch andere Datums-abhängige Abfragen habe die 'funktionieren'.

      Die Temperatur ist _vermutlich_ ein Integer.

      Andreas

      1. Hello,

        Die Temperatur ist _vermutlich_ ein Integer.

        mit Dezimalstellen??

        Der Befehl ist
        DESCRIBE [tablename]

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        Friendships are like back yard gardens. We always mean to tend to them, we just seem to put to put them off until next week.  --  Christian Clemenson as Jerry Espenson in Boston Legal: "Patriot Acts"
        1. Der Befehl ist
          DESCRIBE [tablename]

          Danke sehr!
          Also

          [Field] => DatumZeit
          [Type] => datetime

          und

          [Field] => Temperatur
          [Type] => char(5)

          Andreas

          1. Hi,

            [Field] => Temperatur
            [Type] => char(5)

            Na das eignet sich ja nun nicht besonders fuer mathematische Operationen wie das Finden eines Minimalwertes.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
          2. Moin!

            [Field] => Temperatur
            [Type] => char(5)

            Also wird das Minimum nach ASCII-Regeln gesucht und gefunden, nicht das Minimum nach Zahlenregeln.

            Abgesehen davon: Wenn dir auf dem Server PHP zur Verfügung steht, dann kannst du auch einfach PHPMyAdmin draufspielen und nutzen.

            - Sven Rautenberg

            1. Also wird das Minimum nach ASCII-Regeln gesucht und gefunden, nicht das Minimum nach Zahlenregeln.

              Ja, ich les mir grad, nochmal, die Eigenschaften der Datentypen durch :(

              Abgesehen davon: Wenn dir auf dem Server PHP zur Verfügung steht, dann kannst du auch einfach PHPMyAdmin draufspielen und nutzen.

              Sicher, ich würde es aber nicht wegen 1 Abfrage aufspielen und konfigurieren. Du?

              Mh, also werde ich den Datentyp in DECIMAL-DEC ändern müssen um glücklich zu werden?
              Ich glaub das ist die Lösung.

              Danke und noch einen schönen Sonntag!

              Andreas

              1. Hallo,

                Mh, also werde ich den Datentyp in DECIMAL-DEC ändern müssen um glücklich zu werden?

                es ist immer eine gute Idee, einen passenden Datentyp zu verwenden. DECIMAL erscheint mir hier gut geeignet.

                Um noch auf die schnelle ein Ergebnis zu ermitteln, kannst Du MySQL auch anweisen, den Wert Deiner Spalte als DECIMAL bzw. FLOAT zu betrachten:

                SELECT
                    -- Suche das Minimum der Spalte Temperatur, wobei die Werte dieser
                    -- Spalte als FLOAT betrachtet werden sollen.
                    MIN(CAST(Temperatur AS FLOAT))
                FROM
                    my_table
                WHERE
                    DatumZeit > NOW() - INTERVAL 1 YEAR

                Auf Dauer wirst Du damit nicht glücklich. Nach erfolgreicher Abfrage kannst Du an die Konvertierung gehen.

                Freundliche Grüße

                Vinzenz

                1. Mh, also werde ich den Datentyp in DECIMAL-DEC ändern müssen um glücklich zu werden?
                  es ist immer eine gute Idee, einen passenden Datentyp zu verwenden. DECIMAL erscheint mir hier gut geeignet.

                  Ich habe jetzt ALTER TABLE my_table CHANGE Temperatur Temperatur DEC NULL angewendet.
                  Die Ausgabe mit dem Statement aus dem OP gibt mir jetzt -21.
                  Das liegt schon sehr nahe an meinem erwarteten Ergebnis.
                  Wieso sind aber die Nachkommastellen verschwunden? Was habe ich beim ALTER TABLE übersehen?

                  Um noch auf die schnelle ein Ergebnis zu ermitteln, kannst Du MySQL auch anweisen, den Wert Deiner Spalte als DECIMAL bzw. FLOAT zu betrachten:

                  Daran hatte ich auch kurz gedacht. Es deshalb:

                  Auf Dauer wirst Du damit nicht glücklich.

                  aber auch nicht gemacht.

                  Danke für Hilfe!

                  Andreas

                  1. Hi,

                    Ich habe jetzt ALTER TABLE my_table CHANGE Temperatur Temperatur DEC NULL angewendet.
                    Die Ausgabe mit dem Statement aus dem OP gibt mir jetzt -21.
                    Das liegt schon sehr nahe an meinem erwarteten Ergebnis.
                    Wieso sind aber die Nachkommastellen verschwunden?

                    Wo hast du denn die gewuenschte Anzahl Nachkommastellen angegeben?

                    MfG ChrisB

                    --
                    „This is the author's opinion, not necessarily that of Starbucks.“
                    1. Ich habe jetzt ALTER TABLE my_table CHANGE Temperatur Temperatur DEC NULL angewendet.
                      Wieso sind aber die Nachkommastellen verschwunden?
                      Wo hast du denn die gewuenschte Anzahl Nachkommastellen angegeben?

                      *such
                      Oha, ich dachte der Wertebereich wird 'automatisch' festgelegt.
                      Wenn ich also z.B. 2.1 eintrage, steht 2.1 drin.
                      Trage ich 2.101 ein (also 3 Nachkommastellen) steht auch 2.101 drin.

                      Obwohl mir das jetzt bei genauerer Überlegung eigentlich dämlich vorkommt...

                      Mein Statement ist jetzt
                      ALTER TABLE my_table CHANGE Temperatur Temperatur DECIMAL(3,1) NULL

                      Liegen die Temperaturen ausserhalb dieses Bereichs sollte, technisch bedingt, eh nichts mehr aufgezeichnet werden können :)

                      Danke!

                      Andreas

              2. Hi,

                Abgesehen davon: Wenn dir auf dem Server PHP zur Verfügung steht, dann kannst du auch einfach PHPMyAdmin draufspielen und nutzen.
                Sicher, ich würde es aber nicht wegen 1 Abfrage aufspielen und konfigurieren. Du?

                das ist eine Schlussfolgerung nach dem Motto: Einmal ist keinmal. Weiter mit vollständiger Induktion.

                Cheatah

                --
                X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes
                1. Abgesehen davon: Wenn dir auf dem Server PHP zur Verfügung steht, dann kannst du auch einfach PHPMyAdmin draufspielen und nutzen.
                  Sicher, ich würde es aber nicht wegen 1 Abfrage aufspielen und konfigurieren. Du?
                  das ist eine Schlussfolgerung nach dem Motto: Einmal ist keinmal. Weiter mit vollständiger Induktion.

                  Zunächst einmal finde ich es sinnvoller für mich viel "von Hand" zu machen.
                  Warum? Weil ich ja offensichtlich nicht so viel vom MySQL verstehe und ich es auch nicht lerne indem ich in einem Auswahlfeld auswähle (klingt das blöd) und anschließend auf "Ook" drücken kann.

                  Es macht mir auch einfach viel mehr Spaß Datenbanken, Tabellen etc. in Arrays zu schreiben und sie mir nach Laune formatiert ausgeben zu lassen. Lernfaktor etc.
                  Sonst hätte es z.B. wohl auch noch eine Weile gedauert bis ich auf DESCRIBE gekommen wär ;)

                  Und ich weiß, dass man sich den Code vom PHPMyAdmin anzeigen lassen kann.
                  Ich mag aber diese ´´ nicht besonders und lerne durch copy&paste nichts.

                  Nichts gegen den Einsatz im allgemeinen, ich halte es hier aber für überflüssig.

                  Andreas

                  1. Hi,

                    Zunächst einmal finde ich es sinnvoller für mich viel "von Hand" zu machen. [...]
                    Nichts gegen den Einsatz im allgemeinen, ich halte es hier aber für überflüssig.

                    finde ich gut, aber es passt nicht zu der Argumentation "ich brauch's eh nur ein Mal".

                    Cheatah

                    --
                    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                    X-Will-Answer-Email: No
                    X-Please-Search-Archive-First: Absolutely Yes
                    1. Hey Cheatah,

                      Zunächst einmal finde ich es sinnvoller für mich viel "von Hand" zu machen. [...]
                      Nichts gegen den Einsatz im allgemeinen, ich halte es hier aber für überflüssig.
                      finde ich gut, aber es passt nicht zu der Argumentation "ich brauch's eh nur ein Mal".

                      Das versteh ich nicht.
                      Es ging darum den Datentyp einer Spalte herauszufinden.
                      Geh ich jetzt von meinem Wissensstand von vor ein paar Stunden aus, hätte ich also PMP aufgespielt, mir den Typ angeschaut und es wieder gelöscht.
                      Zu viel Aufwand für eine Sache die mit DESCRIBE table erledigt ist. Mir fehlte halt nur das DESCRIBE.

                      Für "den Rest" brauch ich kein PMP, meine Abfrage war ja soweit korrekt. Ich seh also keinen weiteren Nutzen ausser, dass es mir angezeigt hätte welchen Typs Spalte X in Tabelle Y ist.

                      Andreas

                      1. Hi,

                        Es ging darum den Datentyp einer Spalte herauszufinden.

                        mir ging es um diese Deine Aussage: "Sicher, ich würde es aber nicht wegen 1 Abfrage aufspielen und konfigurieren. Du?"

                        Für "den Rest" brauch ich kein PMP,

                        Ich gehe davon aus, dass Du nicht über hellseherische oder ähnliche Fähigkeiten verfügst. Unter dieser Prämisse kennst Du "den Rest" nicht.

                        Cheatah

                        --
                        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                        X-Will-Answer-Email: No
                        X-Please-Search-Archive-First: Absolutely Yes
                        1. Ich gehe davon aus, dass Du nicht über hellseherische oder ähnliche Fähigkeiten verfügst. Unter dieser Prämisse kennst Du "den Rest" nicht.

                          Da gebe ich dir Recht. Im Moment brauch ich es aber tatsächlich nicht und nur für den Fall dass ich es doch noch 1 oder auch ein paar Mal mehr brauch installier ich es nicht prophylaktisch.
                          Wie gesagt, ist mir da der Aufwand zu groß.
                          Für den anderen Fall, dass ich es doch irgendwann "ein paar Mal _mehr_" brauch, kann ich es dann immernoch hoch schaufeln :)

                          Andreas

                          1. Moin!

                            Ich gehe davon aus, dass Du nicht über hellseherische oder ähnliche Fähigkeiten verfügst. Unter dieser Prämisse kennst Du "den Rest" nicht.

                            Da gebe ich dir Recht. Im Moment brauch ich es aber tatsächlich nicht und nur für den Fall dass ich es doch noch 1 oder auch ein paar Mal mehr brauch installier ich es nicht prophylaktisch.
                            Wie gesagt, ist mir da der Aufwand zu groß.
                            Für den anderen Fall, dass ich es doch irgendwann "ein paar Mal _mehr_" brauch, kann ich es dann immernoch hoch schaufeln :)

                            Mir würde ehrlich gesagt nie in den Sinn kommen, eine Datenbank OHNE PMA zu betreiben. Insofern wäre PMA schon direkt vor der ersten Skriptinstallation auf den Server gewandert und konfiguriert worden - was sich in der Regel auf das Anpassen des DB-Zugangs beschränkt.

                            Denn die Erfahrung zeigt, dass sich im Verlauf des Lebens dieser Datenbank mehr als einmal die Situation ergibt, bei der man "nur mal eben schnell eine kleine Änderung" machen muß.

                            - Sven Rautenberg

              3. Moin!

                Abgesehen davon: Wenn dir auf dem Server PHP zur Verfügung steht, dann kannst du auch einfach PHPMyAdmin draufspielen und nutzen.

                Sicher, ich würde es aber nicht wegen 1 Abfrage aufspielen und konfigurieren. Du?

                Es bleibt ja nicht bei dieser einen Abfrage, die DB will ja fortlaufend weiter administriert werden.

                - Sven Rautenberg

  2. Guten Tag,

    SELECT MIN(Temperatur) FROM my_table WHERE DatumZeit > NOW() -INTERVAL 1 YEAR

    Was sagt
    SELECT MIN(Temperatur), DatumZeit FROM my_table WHERE DatumZeit > (NOW() - INTERVAL 1 YEAR)

    Gruß
    Christoph Jeschke

    --
    Zend Certified Engineer
    Certified Urchin Admin
    1. Was sagt
      SELECT MIN(Temperatur), DatumZeit FROM my_table WHERE DatumZeit > (NOW() - INTERVAL 1 YEAR)

      Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

      (...) supplied argument is not a valid MySQL result resource in (...)

      Andreas

      1. Guten Tag,

        Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

        (...) supplied argument is not a valid MySQL result resource in (...)

        Äh, ja, klar. Hätte ich auch selbst drauf kommen können.

        Gruß
        Christoph Jeschke

        --
        Zend Certified Engineer
        Certified Urchin Admin