tilly001

Letzter Eintrag des Tages aus MySQL DB auslesen

Hallo zusammen,

ich möchte aus einer MySQL DB Tabelle immer den letzten Tageswert auslesen:


"TIMESTAMP"		"DEVICE"		"TYPE"	           "EVENT"		"READING"	"VALUE"	"UNIT"  
"2023-05-03 20:22:05"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 10.9"	"energytoday"	"10.9"	\N  
"2023-05-03 19:20:00"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 10.8"	"energytoday"	"10.8"	\N  
"2023-05-03 18:42:59"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 10.7"	"energytoday"	"10.7"	\N  
"2023-05-03 18:21:11"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 10.6"	"energytoday"	"10.6"	\N  
"2023-05-03 18:06:17"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 10.5"	"energytoday"	"10.5"	\N  
"2023-05-03 17:54:08"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 10.4"	"energytoday"	"10.4"	\N  
"2023-05-02 19:39:25"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 8.8"	"energytoday"	"8.8"	\N  
"2023-05-02 18:58:31"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 8.7"	"energytoday"	"8.7"	\N  
"2023-05-02 18:32:11"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 8.6"	"energytoday"	"8.6"	\N  
"2023-05-02 18:13:53"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 8.5"	"energytoday"	"8.5"	\N  
"2023-05-02 18:02:33"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 8.4"	"energytoday"	"8.4"	\N  
"2023-05-01 20:35:47"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 8.9"	"energytoday"	"8.9"	\N  
"2023-05-01 19:15:37"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 8.8"	"energytoday"	"8.8"	\N  
"2023-05-01 18:46:37"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 8.7"	"energytoday"	"8.7"	\N  
"2023-05-01 18:12:25"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 8.6"	"energytoday"	"8.6"	\N  
"2023-05-01 17:54:51"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 8.5"	"energytoday"	"8.5"	\N  
"2023-04-30 19:40:28"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 9.8"	"energytoday"	"9.8"	\N  
"2023-04-30 19:00:20"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 9.7"	"energytoday"	"9.7"	\N  
"2023-04-30 18:32:21"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 9.6"	"energytoday"	"9.6"	\N  
"2023-04-30 18:11:30"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 9.5"	"energytoday"	"9.5"	\N  
"2023-04-30 17:57:58"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 9.4"	"energytoday"	"9.4"	\N  

So sollte das Ergebnis dann aussehen:
"TIMESTAMP"		"DEVICE"		"TYPE"		"EVENT"		       "READING"	  "VALUE"	"UNIT"  
"2023-05-03 20:22:05"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 10.9"	"energytoday"	"10.9"	\N  
"2023-05-02 19:39:25"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 8.8"	"energytoday"	"8.8"	\N  
"2023-05-01 20:35:47"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 8.9"	"energytoday"	"8.9"	\N  
"2023-04-30 19:40:28"	"MQTT2_growatt_931744"	"MQTT2_DEVICE"	"energytoday: 9.8"	"energytoday"	"9.8"	\N  

Bisher habe ich:
SELECT *
	FROM history WHERE DEVICE = "MQTT2_growatt_931744" AND READING = "energytoday"  
ORDER BY TIMESTAMP DESC

Wer kann mir helfen ... ich komme nicht weiter.
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 7011413765

Url: https://administrator.de/forum/letzter-eintrag-des-tages-aus-mysql-db-auslesen-7011413765.html

Ausgedruckt am: 01.06.2025 um 09:06 Uhr

ukulele-7
ukulele-7 04.05.2023 um 10:38:04 Uhr
Goto Top
LIMIT 1 wäre das naheliegenste.
tilly001
tilly001 04.05.2023 um 10:46:14 Uhr
Goto Top
Danke für die Antwort.

Hilft leider nicht, denn es wird nur die neuste Zeile angezeigt.

Ich möchte den letzten Eintrag jeden Tages im Ergebnis haben.
ukulele-7
ukulele-7 04.05.2023 aktualisiert um 11:04:38 Uhr
Goto Top
Ah jetzt verstanden.

Es gibt mehrere Wege das zu erreichen, der aus meiner Sicht einfachste wäre mit einer Window Funktion, hier mal als Beispiel:
WITH t AS (
SELECT ROW_NUMBER() OVER (PARTITION BY convert(DATE,TIMESTAMP) ORDER BY TIMESTAMP DESC) AS zeile,*
FROM history WHERE DEVICE = "MQTT2_growatt_931744" AND READING = "energytoday"  
)
SELECT *
FROM t
WHERE zeile = 1
ORDER BY TIMESTAMP DESC
Es kommt leider etwas auf deine MySQL Version an ob die das kann, möglich. Auch ist convert(DATE,TIMESTAMP) jetzt MSSQL Syntax, das müsste man bestimmt auf MySQL übersetzen. Der Rest läuft entweder oder MySQL kann das nicht oder ist zu alt.

Edit: ORDER BY TIMESTAMP DESC in t ergänzt.
tilly001
tilly001 04.05.2023 um 11:06:53 Uhr
Goto Top
Konkret ist es MariaDB 10.5.19. Folgender Fehler kommt nach dem Testcode von oben:
sql 1064
ukulele-7
ukulele-7 04.05.2023 um 11:32:01 Uhr
Goto Top
MariaDB Manual sagt:
CONVERT(expr, type)
das hätte man jetzt auch noch selber Googlen können, daraus folgt:
WITH t AS (
SELECT ROW_NUMBER() OVER (PARTITION BY convert(TIMESTAMP,DATE) ORDER BY TIMESTAMP DESC) AS zeile,*
FROM history WHERE DEVICE = "MQTT2_growatt_931744" AND READING = "energytoday"  
)
SELECT *
FROM t
WHERE zeile = 1
ORDER BY TIMESTAMP DESC
WITH und ROW_NUMBER() werden von MariaDB supported und 10.5.19 ist aktuell, sollte also gehen.
tilly001
tilly001 04.05.2023 um 13:04:10 Uhr
Goto Top
Leider gibt es noch immer eine Fehlermeldung:
sql 1064
ukulele-7
ukulele-7 04.05.2023 um 13:28:12 Uhr
Goto Top
Sry hab kein MariaDB zum debuggen. Musst du mal gucken ob z.B. nur der innere Select funktioniert oder irgendjemand anders hier sieht noch das Problem.
tilly001
Lösung tilly001 04.05.2023 aktualisiert um 13:34:08 Uhr
Goto Top
Ich konnte eine Lösung finden:

SELECT DATE(TIMESTAMP) AS Datum, MAX(TIMESTAMP)AS MAX, Device, Reading, MAX(CAST(VALUE AS DECIMAL(4,2))) AS Value
	FROM history WHERE DEVICE = "MQTT2_growatt_931744" AND READING = "energytoday"  
	GROUP BY Datum
	ORDER BY MAX(TIMESTAMP) DESC
	LIMIT 15
sql out
ukulele-7
ukulele-7 04.05.2023 um 14:25:19 Uhr
Goto Top
Das darf so eigentlich nicht funktionieren: Bei Verwendung von GROUP BY müssen alle Spalten im GROUP BY aufgeführt werden oder im Select-Teil aggregiert werden. Von MariaDB würde ich an dieser Stelle einen Fehler erwarten, ähnlich wie
Msg 8120, Level 16, State 1, Line 4
Die Device-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.
Entweder erkennt MariaDB hier das im WHERE-Teil besagte Spalten auf einen Wert eingegrenzt werden oder, was ich eher glaube, hier kommt altes MySQL Verhalten zum Vorschein. Eigentlich hat MySQL das nach Jahrzehnten mal gefixt, früher kam dann einfach "irgendwas" raus.