[vz-users] Aggregation (minute) schlägt fehl

Jens Scheidtmann jens.scheidtmann at gmail.com
Fr Mär 24 21:06:54 CET 2023


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/e9959dd5/attachment.html>


Mehr Informationen über die Mailingliste volkszaehler-users