[vz-users] Aggregation (minute) schlägt fehl
Michael Hartmann
hartmann-micha at web.de
Sa Mär 25 12:40:13 CET 2023
Hallo Jens,
ich habe das erste SQL-Statement ausgeführt und hänge das CSV hier an.
Einen Nullwert kann ich da nicht ausmachen. Auch scheint mir die Ausgabe nicht so zu sein wie gewünscht/erwartet? Die Frage ist auch, ob der Ansatz so funktioniert, da ich die Aggregationstabelle ja neu aufgebaut habe und das minütliche Aggregieren aktuell fehlerfrei ist.
Viele Grüße
Micha
Von: Jens Scheidtmann [mailto:jens.scheidtmann at gmail.com]
Gesendet: Freitag, 24. März 2023 21:13
An: volkszaehler.org - users; Michael Hartmann
Betreff: Re: [vz-users] Aggregation (minute) schlägt fehl
Kann sein, dass die Mailinglistensoftware die Statements zerhackt hat. Deshalb hier nochmal as Anhang.
Jens
Am Fr., 24. März 2023 um 21:06 Uhr schrieb Jens Scheidtmann <jens.scheidtmann at gmail.com>:
Hallo Michael,
Um die Datensätze, die den Fehler verursachen, einzugrenzen öffne bitte mysql als root und gebe folgende Befehle ein:
$ sudo mysql
> use volkszaehler;
Dann kopiere dieses Statement hier ein:
--- schnipp ---
SELECT channel_id
, 1 AS type
, MAX(agg.timestamp) AS timestamp
, SUM(agg.val_by_time) as s
, MAX(agg.timestamp) as t_max
, MIN(agg.prev_timestamp) as t_min
, MAX(agg.timestamp) - MIN(agg.prev_timestamp) as delta
, COUNT(agg.value) AS count
FROM ( SELECT channel_id
, timestamp
, value
, value * (timestamp - @prev_timestamp) AS val_by_time
, COALESCE(@prev_timestamp, 0) AS prev_timestamp
, @prev_timestamp := timestamp
FROM data CROSS JOIN (SELECT @prev_timestamp := UNIX_TIMESTAMP(DATE_ADD(FROM_UNIXTIME(MAX(timestamp) / 1000, "%Y-%m-%d %H:%i:00"), INTERVAL 1 minute)) * 1000
FROM aggregate
WHERE type = 1
AND aggregate.channel_id = "3") AS vars
WHERE channel_id = "3"
AND timestamp >= IFNULL((SELECT UNIX_TIMESTAMP(DATE_ADD(FROM_UNIXTIME(MAX(timestamp) / 1000, "%Y-%m-%d %H:%i:00"), INTERVAL 1 minute)) * 1000
FROM aggregate
WHERE type = 1
AND aggregate.channel_id = "3" ), 0)
AND timestamp < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), "%Y-%m-%d %H:%i:00")) * 1000 ) AS agg
GROUP BY channel_id
, YEAR(FROM_UNIXTIME(timestamp/1000))
, DAYOFYEAR(FROM_UNIXTIME(timestamp/1000))
, HOUR(FROM_UNIXTIME(timestamp/1000))
, MINUTE(FROM_UNIXTIME(timestamp/1000))
ORDER BY 1,2,3,4,5
INTO OUTFILE '/var/lib/mysql/offending.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n' ;
--- schnapp ---
Wenn Du uns die Werte nicht verraten möchtest, kannst Du "value" am Anfang durch "0" ersetzen.
Zeige uns bitte die Tabelle aus /var/lib/mysql/offending.csv!
Dort musst Du dann die Zeile finden, die in der vorletzten Spalte eine "0" hat.
In den Zeilen davor und danach findest Du die timestamps, die Du im folgenden Statement für ****MIN**** und ****MAX**** einsetzen musst:
--- schnipp ---
SELECT channel_id
, timestamp
, value
, value * (timestamp - @prev_timestamp) AS val_by_time
, COALESCE(@prev_timestamp, 0) AS prev_timestamp
, @prev_timestamp := timestamp
FROM data CROSS JOIN (SELECT @prev_timestamp := UNIX_TIMESTAMP(DATE_ADD(FROM_UNIXTIME(MAX(timestamp) / 1000, "%Y-%m-%d %H:%i:00"), INTERVAL 1 minute)) * 1000
FROM aggregate
WHERE type = 1
AND aggregate.channel_id = "3") AS vars
WHERE channel_id = "3"
AND timestamp >= ****MIN****
AND timestamp < ****MAX****
INTO OUTFILE '/var/lib/mysql/rawdata.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n' ;
--- schnapp ---
Wenn Du uns die Werte nicht verraten möchtest, kannst Du die zwei "value" am Anfang durch "0" ersetzen.
Auch diese Datei solltest Du anhängen.
-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20230325/f9d0a13b/attachment-0001.html>
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname : offending.csv
Dateityp : application/vnd.ms-excel
Dateigröße : 979 bytes
Beschreibung: nicht verfügbar
URL : <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20230325/f9d0a13b/attachment-0001.xlb>
Mehr Informationen über die Mailingliste volkszaehler-users