Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Höchster Wert eines Tages

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Höchster Wert eines Tages

    Hallo

    Ich bin hier gerade am Verzweifeln mit der Abfrage nach den höchsten 5 werten pro tag.
    Habe hier einfach mal 3 Screenshots von phpmyadmin die meine abfragen zeigen.



    Grundsätzlich stimmen die werte auch, aber das datum bzw. die Uhrzeit stimmen nicht.
    Ich habe bei meinen screenshot die ID mitaufgerufen um das unglaubwürdige
    Ergebnis (um 23.56 26,5Grad) zu überprüfen.
    Ich bin gerade von sqlite auf mysql umgestiegen. In sqlite funktioniert die abfrage einwandfrei.
    Wo könnte der Fehler der meiner Abfrage liegen.

  • #2
    Zitat von fume Beitrag anzeigen
    Wo könnte der Fehler der meiner Abfrage liegen.
    Siehe meine Antwort im anderen Faden.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      WHERE Einschränkung auf den gewünschten Tag und dann ORDER BY und LIMIT
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #4
        Habe mich vielleicht falsch ausgedrückt. Aber ich suche nicht die höchsten werte eines tages (WHERE....) sondern die höchsten 5 Werte der ganzen Tabelle. Wobei nur ein wert pro Tag (der höchste) angezeigt wird.

        Kommentar


        • #5
          Was ich eigentlich am verwirrend finde ist : Warum kann die abfrage 2 Werte mit verschiedenen index "ID" verbinden:
          Im beispiel. Datum von ID 12336, aussentemp von ID 12270

          Kommentar


          • #6
            Zitat von fume Beitrag anzeigen
            Was ich eigentlich am verwirrend finde ist : Warum kann die abfrage 2 Werte mit verschiedenen index "ID" verbinden:
            Im beispiel. Datum von ID 12336, aussentemp von ID 12270
            Lies meine Antwort.
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Zitat von akretschmer Beitrag anzeigen
              Das ist Schade. Also daß Sqlite diesen Syntaxfehler nicht erkennt. ich dachte, nur MySQL ist so behindert.

              Also: in Abfragen mit Aggregationen müssen alle Ergebnisspalten entweder aggregiert oder gruppiert werden. Prüf Deine Abfrage, dies ist nicht der Fall. Die DB ist so frei, Dir ein mehr oder weniger zufälliges Resultat zu liefern.

              Was kannst Du tun?
              zurück zu Sqlite. Bis das da gefixt ist. Ist also eine tickende Zeitbombe.
              weiter bei MySQL. Wird demnächst gefixt, ab 5.7.5 oder so erkennt MySQL den Fehler
              gleich eine richtige DB nehmen, die zu mehr Sorgfalt zwingt und dafür mit korrekten Resultaten belohnt.
              Habs erst jetzt gelesen. (Ist ja meine schuld da ich zuerst falsch gepostet habe).
              Dann ist wohl besser ich bleibe bei sqlite. Ich habe nur bedenken mit der Performance wenn die Datenmenge ansteigt.(1440 Datensätze/Tag).

              Danke
              Norbert

              Kommentar


              • #8
                Zitat von fume Beitrag anzeigen
                Habs erst jetzt gelesen. (Ist ja meine schuld da ich zuerst falsch gepostet habe).
                Dann ist wohl besser ich bleibe bei sqlite. Ich habe nur bedenken mit der Performance wenn die Datenmenge ansteigt.(1440 Datensätze/Tag).

                Danke
                Norbert
                Na, ich hoffe, daß das bei Sqlite auch bald gefixt wird.
                PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                Kommentar


                • #9
                  Zitat von akretschmer Beitrag anzeigen
                  Na, ich hoffe, daß das bei Sqlite auch bald gefixt wird.
                  Also, wäre ich Du, würde ich es schlicht und einfach richtig machen. Wenn Du "höchsten 5 Werte der ganzen Tabelle. Wobei nur ein wert pro Tag (der höchste) " suchst, dann kann Dir die ID des Datensatzes ja egal sein. Was bleibt, ist datum und max(temp) gruppiert nach Datum und sortiert nach Temp. absteigend limitiert auf 5.
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    Ja so habe ich es auch gemacht. Die ID habe ich wie schon im ersten Post nur eingefügt zum überprüfen welche Werte wirklich mit der ID verknüpft sind.

                    Kommentar


                    • #11
                      Zitat von fume Beitrag anzeigen
                      Ja so habe ich es auch gemacht. Die ID habe ich wie schon im ersten Post nur eingefügt zum überprüfen welche Werte wirklich mit der ID verknüpft sind.
                      Code:
                      test=*# select * from messung ;
                       id |   datum    | temp
                      ----+------------+------
                        1 | 2014-10-26 |   10
                        2 | 2014-10-26 |   20
                      (2 rows)
                      
                      Time: 0,249 ms
                      test=*# select id, datum, max(temp) from messung group by datum;
                      ERROR:  column "messung.id" must appear in the GROUP BY clause or be used in an aggregate function
                      LINE 1: select id, datum, max(temp) from messung group by datum;
                      Die DB kann nicht wissen, was Du willst. Willst Du (auch) nach der ID gruppieren? Das ist natürlich nicht der Fall. Diesen Fehler erkennen faktisch alle Datenbanken, außer MySQL und wohl wohl auch sqlite. In MySQL wird es irgendwann gefixt sein, sqlite vermutlich auch.

                      Das willst Du sicher nicht:

                      Code:
                      test=*# select id, datum, max(temp) from messung group by id, datum;
                       id |   datum    | max
                      ----+------------+-----
                        1 | 2014-10-26 |  10
                        2 | 2014-10-26 |  20
                      (2 rows)
                      was aber korrekt ist: je ID und Datum der Max-Wert von Temp. Das willst Du sicher auch nicht:

                      Code:
                      test=*# select min(id), datum, max(temp) from messung group by datum;
                       min |   datum    | max
                      -----+------------+-----
                         1 | 2014-10-26 |  20
                      (1 row)
                      
                      Time: 8,943 ms
                      test=*# select max(id), datum, max(temp) from messung group by datum;
                       max |   datum    | max
                      -----+------------+-----
                         2 | 2014-10-26 |  20
                      (1 row)

                      Mir ist schon klar, was Du willst:

                      Code:
                      test=*# select distinct on (datum) id, datum, temp from messung order by datum, temp desc;
                       id |   datum    | temp
                      ----+------------+------
                        2 | 2014-10-26 |   20
                      (1 row)
                      Aber das (distinct on()) kann MySQL - wie so vieles - nicht.

                      Also suchst Du

                      Code:
                      test=*# select datum, max(temp) from messung group by datum;
                         datum    | max
                      ------------+-----
                       2014-10-26 |  20
                      (1 row)
                      Wenn Du die ID doch noch haben willst dann geht das (wohl auch in MySQL) so:

                      Code:
                      test=*# select * from messung where (datum, temp) in (select datum, max(temp) from messung group by datum);
                       id |   datum    | temp
                      ----+------------+------
                        2 | 2014-10-26 |   20
                      (1 row)
                      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                      Kommentar


                      • #12
                        Zitat von akretschmer Beitrag anzeigen

                        Also suchst Du

                        Code:
                        test=*# select datum, max(temp) from messung group by datum;
                           datum    | max
                        ------------+-----
                         2014-10-26 |  20
                        (1 row)
                        Genau das mache ich ja nur noch zusätzlich noch nach grösse sortiert.

                        Code:
                        SELECT datum, MAX( aussentemp ) AS maxtemp
                        FROM wetterdb
                        GROUP BY DATE( datum ) 
                        ORDER BY maxtemp DESC 
                        LIMIT 5
                        
                        26.5 ° C	2014-10-19 23:59:00
                        25.9 ° C	2014-10-17 22:52:00
                        25.7 ° C	2014-10-18 23:59:00
                        25.2 ° C	2014-10-20 23:57:00
                        25.1 ° C	2014-10-02 15:56:00
                        Richtig währe dieses Ergebnis welches ich bei gleicher abfrage
                        in sqlite erhalte, es sind andere Uhrzeiten:


                        Code:
                        Temperatur 	Datum Uhrzeit
                        26.5 ° C	19.09.2014 15:57:00
                        25.9 ° C	17.09.2014 16:26:00
                        25.7 ° C	18.09.2014 14:45:00
                        25.2 ° C	20.09.2014 17:44:00
                        25.1 ° C	02.10.2014 14:26:00

                        Kommentar


                        • #13
                          Zitat von fume Beitrag anzeigen
                          Genau das mache ich ja nur noch zusätzlich noch nach grösse sortiert.

                          Code:
                          SELECT datum, MAX( aussentemp ) AS maxtemp
                          FROM wetterdb
                          GROUP BY DATE( datum ) 
                          ORDER BY maxtemp DESC 
                          LIMIT 5
                          
                          26.5 ° C	2014-10-19 23:59:00
                          25.9 ° C	2014-10-17 22:52:00
                          25.7 ° C	2014-10-18 23:59:00
                          25.2 ° C	2014-10-20 23:57:00
                          25.1 ° C	2014-10-02 15:56:00
                          Richtig währe dieses Ergebnis welches ich bei gleicher abfrage
                          in sqlite erhalte, es sind andere Uhrzeiten:


                          Code:
                          Temperatur 	Datum Uhrzeit
                          26.5 ° C	19.09.2014 15:57:00
                          25.9 ° C	17.09.2014 16:26:00
                          25.7 ° C	18.09.2014 14:45:00
                          25.2 ° C	20.09.2014 17:44:00
                          25.1 ° C	02.10.2014 14:26:00

                          Was für Datentypen?
                          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                          Kommentar


                          • #14
                            datum ist datetime, aussentemp ist decimal(3,1)

                            Kommentar


                            • #15
                              Zitat von fume Beitrag anzeigen
                              datum ist datetime, aussentemp ist decimal(3,1)
                              ich war über die °C - Angabe irritiert...
                              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                              Kommentar

                              Lädt...
                              X