MIN-Wert aus Daten-Teilbereich

Arrowdynamics

Benutzer
Beiträge
12
Guten Tag,
ich habe eine Tabelle weather_data mit zwei Spalten, "Temperatur" und "Zeitstempel". Ich möchte nun per SQL-Abfrage die Minimaltemperatur aus der Spalte "Temperatur" ermitteln, aber NUR aus jenem Zeilenbereich, bei denen der Zeitstempel größer als ein bestimmter Wert ist.

Struktur der Tabelle:
TemperaturZeitstempel
15,61674169300
10,01674169100
21,41674169150
19,81674169500

SQL:
SELECT zeitstempel AS zeitmin, MIN(temperatur) AS tempmin FROM weather_data WHERE zeitstempel >=1674169200

Im Beispiel oben müsste also die Temperatur von 15,6 ausgegeben werden, weil das der Minimalwert ist aus allen Werten, deren Zeitstempel größer als 1674169200 ist.

Aber mein Befehl funktioniert nicht.. hat jemand eine Idee, wie ich einen Maximalwert aus einem Subset von Zeilen finden kann, die größer als ein bestimmter Wert sind?
Ich bin so dankbar um jede Hilfe. Danke!
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.933
Dein Befehl ist syntaktisch falsch, MySQL liefert ein Ergebniss aus dem Zufallsgenerator anstelle einer Fehlermeldung. Haben wir hier faktisch täglich, lies einfach mal die letzten 3-4 threads...
 

Arrowdynamics

Benutzer
Beiträge
12
Vielen Dank für Deine Antwort. Ich finde sehr viele Beispiele, bei denen das Subset aus der Spalte besteht, in der auch der MIN-Wert gesucht werden soll, aber bei mir soll ja der MIN-Wert gefunden werden in einem Subset, das durch Bedingungen einer ANDEREN Spalte definiert wurde. Und dafür finde ich kein Beispiel. :-(
Das hier war mein ursprünglicher Ansatz, der komischerweise mit MAX() funktioniert, aber nicht mehr mit MIN():

SQL:
SELECT * FROM weather_data WHERE temperatur = (SELECT MIN(temperatur) FROM weather_data WHERE zeitstempel >=1674169200)
 

akretschmer

Datenbank-Guru
Beiträge
9.933
Vielen Dank für Deine Antwort. Ich finde sehr viele Beispiele, bei denen das Subset aus der Spalte besteht, in der auch der MIN-Wert gesucht werden soll, aber bei mir soll ja der MIN-Wert gefunden werden in einem Subset, das durch Bedingungen einer ANDEREN Spalte definiert wurde. Und dafür finde ich kein Beispiel. :-(
Das hier war mein ursprünglicher Ansatz, der komischerweise mit MAX() funktioniert, aber nicht mehr mit MIN():

SQL:
SELECT * FROM weather_data WHERE temperatur = (SELECT MIN(temperatur) FROM weather_data WHERE zeitstempel >=1674169200)
in der Form sollte es funktionieren. Aber bei MySQL weiß man das nie so genau ...
 

Arrowdynamics

Benutzer
Beiträge
12
Äh.. bedeutet das, es könnte ein richtiger Befehl sein, aber MySQL "macht" einen Fehler oder funktioniert nicht richtig? Dann kann ich mich natürlich zu Tode suchen..
Das klingt irgendwie .. erschreckend.
 

akretschmer

Datenbank-Guru
Beiträge
9.933
Code:
postgres=# select * from arrowdynamics ;
 temp |    zeit    
------+------------
 15.6 | 1674169300
 10.0 | 1674169100
 21.4 | 1674169150
 19.8 | 1674169500
(4 rows)

postgres=# select * from arrowdynamics where temp=(select min(temp) from arrowdynamics where zeit >=1674169200);
 temp |    zeit    
------+------------
 15.6 | 1674169300
(1 row)

postgres=#
 

akretschmer

Datenbank-Guru
Beiträge
9.933
Code:
postgres=# select * from arrowdynamics where temp=(select max(temp) from arrowdynamics where zeit >=1674169200);
 temp |    zeit    
------+------------
 19.8 | 1674169500
(1 row)
 

Arrowdynamics

Benutzer
Beiträge
12
Jap.. in der Theorie funktioniert es. Aber nun besteht meine Tabelle ehrlicherweise aus tausenden von Einträgen und dann findet der Befehl unsinnige Werte, die keinen Sinn ergeben. ABER der MAX() Aufruf funktioniert super.
Ich wollte nur sehen ob die Syntax meines Befehls völliger Quark ist oder ob das die Experten auch so als Query schreiben würden. Zumindest weiß ich jetzt durch dein Feedback, dass mein erster Befehl auch der richtige war und das Problem mutmaßlich woanders oder an MySQL selbst liegt. Wobei ich letzteres irgendwie noch nicht ganz glauben kann.
 

akretschmer

Datenbank-Guru
Beiträge
9.933
und das wäre übrigens die Reaktion einer korrekt arbeitenden Datenbank auf deinen ersten Befehl:

Code:
postgres=# select zeit, min(temp) from arrowdynamics where zeit >=1674169200;
ERROR:  column "arrowdynamics.zeit" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select zeit, min(temp) from arrowdynamics where zeit >=16741...
               ^
postgres=#
 

Arrowdynamics

Benutzer
Beiträge
12
Der Fehler besteht darin, dass er mit exakt diesem Befehl einen Minwert liefert, dessen Zeitstempel eben NICHT größer als der angegebene Wert ist, sondern kleiner! Mit anderen Worten, er ignoriert das WHERE Kriterium
 
Werbung:
Oben