SQL Maximumwert ermitteln und via Update in Tabelle schreiben

Woodz

Lieutenant
Registriert
Apr. 2009
Beiträge
689
Hallo.

Ich habe zwei MySQL Tabellen "Stundenwert" und "Extremwerte".
In der Tabelle "Stundenwerte" werden z.B. für 3 Punkte die Temperaturen jede Stunde abgelegt:

Beispiel (verkürzt):
Pkt_IDTerminDatumWert
pkt012021-10-10 01:00:002021-10-104.5
pkt012021-10-10 02:00:002021-10-105.1
pkt022021-10-10 01:00:002021-10-103.5
pkt022021-10-10 02:00:002021-10-106.2
pkt032021-10-10 01:00:002021-10-102.3
pkt032021-10-10 02:00:002021-10-103.3
pkt012021-10-11 01:00:002021-10-111.5
pkt012021-10-11 02:00:002021-10-112.3
pkt022021-10-11 01:00:002021-10-116.4
pkt022021-10-11 02:00:002021-10-117.1
pkt032021-10-11 01:00:002021-10-113.3
pkt032021-10-11 02:00:002021-10-111.1

Die zweite Tabelle Extremwerte besitzt eine Spalte "Maximumtemperatur".
Pkt_IDDatumMaximumtemperatur
pkt012021-10-105.1
pkt022021-10-106.2
pkt032021-10-103.3
pkt012021-10-112.3
pkt022021-10-117.1
pkt032021-10-113.3

Ist es möglich eine SQL-Abfrage zu erstellen, die mir für jedes Datum für jeden Punkt den Maximalwert ermittelt und diesen Anschließend via "UPDATE" in die Spalte Extremwerte.Maximumtemperatur einträgt?

Ich kann zwar über:

SQL:
(SELECT Stundenwerte.Pkt as pkt_id,
       Stundenwerte.Datum as datum,
       MAX(Stundenwerte.Wert) as maxWert
FROM Stundenwerte
WHERE Stundenwerte.Wert is not NULL
GROUP BY Stundenwerte.Datum, Stundenwerte.Pkt_ID) tbl_a

Eine Tabelle (tbl_a) erzeugen, die mir für jedes Datum für jeden Punkt den Maximalwert ermittelt.
Aber ist es anschießend möglich über diese Tabelle (tbl_a) eine UPDATE Funktion laufen zu lassen:

SQL:
UPDATE Extremwerte
SET Maximumtemperatur = tbl_a.maxWert
WHERE Maximumtemperatur.Datum = tbl_a.datum AND
 Maximumtemperatur.pkt_ID = tbl_a.pkt_id;

Die mir dann für jeden Punkt und jedes Datum den Maximalwert in die Spalte"Extremwerte.Maxumumtemperatur" einträgt?

Ich hoffe, ihr habt mein Problem verstanden und meine SQL Syntax ist halbwegs richtig. Ich habe mir das Beispiel gerade spontan aus den Rippen geleiert. :)

Beste Grüße
 
Die einfachste Lösung wäre, dass "Extremwerte" keine Tabelle, sondern eine View ist und live aus "Stundenwerte" ausliest. Die View könnte dann praktisch so aussehen, wie "tbl_a" bei deiner Überlegung.
Das wäre auch vom Datenbankdesign besser, denn die Informationen sind redundant und können sich inhaltlich widersprechen. Mal abgesehen davon, dass man sich keine Gedanken um einen Job machen muss, der das regelmäßig aktualisiert.
 
  • Gefällt mir
Reaktionen: trabifant, Nebuk, Tornhoof und 4 andere
Für die Lösung sehe ich das wie @Enurian

Abgesehen von dem Problem sehe ich da eine erhebliche Redundanz. Ich empfehle bei Timestamps immer die Unix-Time zu nutzen. Zwei Int Felder (je 4Byte) gegenüber 3 Textfelder (je 64kb). Die Funktion wird dann etwas aufwendiger, aber das ist ja nichts was man ständig ändern muss. Siehe Docs von MYSQL zu Unix-Time: Link
Vor allem liese sich dann auch einfach aus der Extremwerttabelle nicht nur das Datum, sondern der genaue Zeitpunkt der Maxima auslesen.
 
In T-SQL könnte das Update-Kommando so aussehen:

SQL:
 Update eWert Set eWert.MaximumTemperatur=sWert.maxWert
    from Extremwerte eWert inner join
     ( Select StundenWerte.Pkt_ID, StundenWerte.Datum, Max(StundenWerte.Wert) as maxWert
            from StundenWerte
       Group by Stundenwerte.Datum, Stundenwerte.Pkt_ID
     ) sWert on eWert.Datum=sWert.Datum and eWert.PKT_ID=sWert.Pkt_ID

Das funktioniert natürlich nur, wenn vorher in Tabelle Extremwerte die Spalten Pkt_ID u. Datum befüllt werden.
Der Weg ist der join von Tabelle Extremwerte zur Unterabfrage.
 
Zuletzt bearbeitet:
Zurück
Oben