SQL mySQL: timestamp -> nur aktuellsten Wert/Tag

WulfmanGER

Commander
Registriert
Juli 2005
Beiträge
2.298
Hallo,

folgende Tabelle:
Code:
Wert      timestamp (typ: datetime)
234        2019-03-25 12:12:12
234        2019-03-26 10:00:00
240        2019-04-01 10:11:43
241        2019-04-01 17:00:00

ich benötige jetzt eine Möglichkeit (mySQL) die sich timestamp anschaut und mir den aktuellsten Wert je TAG anzeigt.

Bei der Tabelle oben würde die Wunschabfrage also ausgeben
Code:
Wert      timestamp
234        2019-03-25 12:12:12
234        2019-03-26 10:00:00
241        2019-04-01 17:00:00
17 Uhr ist aktueller als 10:11 Uhr

Am Ende möchte ich hier einen Verlauf Zeichnen (uff - das wird noch spannend - keine Ahnung G) wo ich aber die "Zwischenwerte" je Tag nicht brauche.

Alternative Optionen:
1) Beim erfassen (PHP) könnte ich prüfen ob es für den TAG schon einen Eintrag gibt und diesen überschreiben -> ich möchte bewusst diese Werte mit erfassen - daher fällt das weg
2) Im nachhinein könnte ich per Script prüfen ob ein YYYY-MM-DD doppelt existiert und alle löschen ausser den aktuellsten -> wie gesagt: ich möchte diese Werte erfassen.

3) Wenn ich die Werte graphisch ausgebe, läuft das eh durch PHP ... in dem Step könnte ich jeden Eintrag entsprechend prüfen. Wenn das per mySQL nicht geht, würde ich wohl dazu übergehen - das bekomme ich dann alleine hin ;)

Was der sache nahe kommt:
Code:
SELECT DISTINCT(DATE(timestamp)) FROM history

Problem ist ... was ist mit WERT ... mit * oder Wert, bekomme ich den nicht angezeigt - Fehlermeldung. Ich nehme mal an das SQL hier ein Problem damit zu haben sich für eine Timestamp-Zeile zu entscheiden. Also müsste da noch irgendwie irgendwas in die Abfrage rein ;)

Danke schon mal ;)

EDIT: irgendwo gibt es immer jemanden der das gleiche Luxusproblem wie man selber hat - nur das finden ist immer etwas tricky ... lange gesucht, nichts gefunden, kaum gepostet, endlich gefunden ...

Code:
SELECT
H.*
FROM history H
INNER JOIN
(
  SELECT
   MAX(timestamp) max_time
  FROM history
  GROUP BY Date(timestamp)
) AS t
ON H.timestamp = t.max_time
 
Zuletzt bearbeitet: (Lösung selber gefunden :))
Hallo,

das erreichst du mit einer Aggregatsfunktion. Mit Distinct warst du schon fast auf dem richtigen Weg.

SQL:
SELECT Wert, DATE(timestamp) AS Datum, MAX(timestamp) AS Max
FROM history
GROUP BY Wert, DATE(timestamp)
ORDER BY MAX(timestamp) DESC;
 
Zuletzt bearbeitet: (Jetzt hamwers ... .))
Man braucht doch gar kein Subquery ;) Index auf "Wert und timestamp" wäre sinnvoll.
 
@ayngush Dadurch, dass du über Wert gruppierst, bekommst du pro Tag mehrere Ergebnisse. Die Krux ist, dass man den Wert für das maximale Datum pro Tag haben möchte. Dafür muss man erst einmal pro Tag den maximalen Zeitstempel suchen und dann über diesen Zeitstempel den dazugehörigen Wert suchen.

Das kann man dann über einen JOIN, eine WHERE-Klausel oder ein WITH (CTE) lösen.
 
Jupp, hast Recht, hatte die unterschiedlichen Werte "240" und "241" in der Problemstellung schlicht beide als "240" gelesen. FCK Sommerzeit :D
 
ayngush schrieb:
SQL:
SELECT Wert, DATE(timestamp) AS Datum, MAX(timestamp) AS Max
FROM history
GROUP BY Wert, DATE(timestamp)
ORDER BY MAX(timestamp) DESC;
klappt leider nicht.

Wert (da kommen zudem noch paar weitere Spalten zu) kann/darf duplikate enthalten und sollte hier keine rolle spielen. Ich hätte als Beispiel auch nur die Timestamp-Spalte nehmen können. Nur so fand ich etwas anschaulicher. Vielleicht verwirrend ...

Mir geht es wirklich nur um Timestamp. Aktuell hab ich 7 werte drin ... 2 Positionen sind yyyy-mm-dd-Duplikate (aber mit anderen Uhrzeiten) und müssen raus aus dem Ergebnis.

Die Menge die sich da ansammeln wird ... Ich nehme mal an Pro Woche ca. 10 Einträge. Nach bereinigung dürfen dann also max. 7 pro Woche angezeigt werden können. In welcher Region ich die Einträge überhaupt verarbeiten möchte ist noch nicht ganz klar. Ich habe gerade erst angefangen und muss mal gucken was das am Ende ergibt. Ich denke aber mal das ich nicht mehr als 1 Jahr sammeln möchte. Danach nur Jahresend-Werte ;) (aber soweit bin ich noch laange nicht!)

Ocram1992 schrieb:
Dafür muss man erst einmal pro Tag den maximalen Zeitstempel suchen und dann über diesen Zeitstempel den dazugehörigen Wert suchen.

ganz genau - das ist der Trick an der geschichte

Ocram1992 schrieb:
Das kann man dann über einen JOIN, eine WHERE-Klausel oder ein WITH (CTE) lösen.

Muss ich mir mal anschauen (ist das nur mySQL8? hab aktuell noch 7.x - 8.x war ein missglücktes Update mit dem ich mich noch mal beschäftigen muss wenn ich Zeit dafür finde) - in den Beispielen hab ich bisher mein Thema nicht identifizieren können. Das aktuelle JOIN tut es ja. Frage ob das bei mehreren hundert Einträgen (wie gesagt: die Ausmaße sind noch nicht bekannt) lohnt. Aber trotzdem versuche ich sowas immer zu optimieren. Hier sind es nur wenige hundert - für das nächste Projekt brauch ich wieder eine Lösung und da wäre ich dann vielleicht 6stellig :)
 
Zurück
Oben