[vz-users] Aggregation (minute) schlägt fehl
Jens Scheidtmann
jens.scheidtmann at gmail.com
Fr Mär 24 21:12:33 CET 2023
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/20230324/816b8399/attachment-0001.html>
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname : test.sql
Dateityp : application/octet-stream
Dateigröße : 2558 bytes
Beschreibung: nicht verfügbar
URL : <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20230324/816b8399/attachment-0001.obj>
Mehr Informationen über die Mailingliste volkszaehler-users