1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Verbräuche aus Zählerstände berechnen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Stoni, 9 März 2016.

  1. Stoni

    Stoni Benutzer

    Hallo,

    ich möchte aus einer Tabelle mit Zählerständen eine zweite Tabelle mit Verbräuchen in Zeitabständen erstellen.

    Ausgangstabelle:
    /*
    -- Query: SELECT * FROM germanenergy.1_meter_raw
    -- Date: 2016-03-09 16:54
    */
    INSERT INTO `1_meter_raw` (`id_1_meter_raw`,`timestamp`,`value`,`source`) VALUES (1,'2013-01-01 00:00:00',0,'test');
    INSERT INTO `1_meter_raw` (`id_1_meter_raw`,`timestamp`,`value`,`source`) VALUES (2,'2013-02-01 00:00:00',300,'test');
    INSERT INTO `1_meter_raw` (`id_1_meter_raw`,`timestamp`,`value`,`source`) VALUES (3,'2013-03-01 00:00:00',500,'test');


    Herauskommen sollen 15 Minuten Verbräuche:
    '2013-05-01 00:00:00', '0.0084005376344086'
    '2013-05-01 00:15:00', '0.0084005376344086'
    '2013-05-01 00:30:00', '0.0084005376344086'
    '2013-05-01 00:45:00', '0.0084005376344086'
    '2013-05-01 01:00:00', '0.0084005376344086'
    '2013-05-01 01:15:00', '0.0084005376344086'


    Summiert man diese über die Monate auf so ergeben sich die Monatsverbräuche.

    z.B. 2013-01, 300

    Über PHP oder C kann man sowas mit schleifen machen. Gibt es auch einen direkten Weg in MySQL?
    Danke schonmal.

    Stoni
     
    Zuletzt bearbeitet: 9 März 2016
  2. akretschmer

    akretschmer Datenbank-Guru

    Geht auch in SQL. Angenommen, diese Tabelle:

    Code:
    test=# create table stoni as select '2016-03-09 18:00:00'::timestamp + s * '1minute'::interval as ts, random() * 10 as value from generate_series(1,30) s;
    SELECT 30   
    test=*# select * from stoni ;   
      ts  |  value   
    ---------------------+-------------------   
     2016-03-09 18:01:00 |  4.32290084660053   
     2016-03-09 18:02:00 |  4.98328131157905   
     2016-03-09 18:03:00 |  7.80218135099858   
     2016-03-09 18:04:00 |  6.93169048056006   
     2016-03-09 18:05:00 |  7.09824803285301   
     2016-03-09 18:06:00 |  9.30736531037837   
     2016-03-09 18:07:00 |  3.11400767881423   
     2016-03-09 18:08:00 |  4.01130246929824   
     2016-03-09 18:09:00 |  8.30512353219092   
     2016-03-09 18:10:00 |  1.36956706177443   
     2016-03-09 18:11:00 |  9.2077004397288   
     2016-03-09 18:12:00 |  2.60535518173128   
     2016-03-09 18:13:00 |  8.88555320445448   
     2016-03-09 18:14:00 |  6.9796333508566   
     2016-03-09 18:15:00 |  7.72524977568537   
     2016-03-09 18:16:00 |  9.54198599327356   
     2016-03-09 18:17:00 |  8.53903520852327   
     2016-03-09 18:18:00 |  9.72800097893924   
     2016-03-09 18:19:00 |  6.3117338437587   
     2016-03-09 18:20:00 |  4.00388177018613   
     2016-03-09 18:21:00 |  9.65917204972357   
     2016-03-09 18:22:00 |  2.50826773233712   
     2016-03-09 18:23:00 |  2.4416547967121   
     2016-03-09 18:24:00 |  1.32351371459663   
     2016-03-09 18:25:00 | 0.745902676135302   
     2016-03-09 18:26:00 |  9.89431032445282   
     2016-03-09 18:27:00 |  6.31013591773808   
     2016-03-09 18:28:00 |  3.22211087681353   
     2016-03-09 18:29:00 |  6.1841758294031   
     2016-03-09 18:30:00 |  7.2846427327022   
    (30 rows)   
    
    
    So bekommst die Zeitstempel aller 5 Minuten:

    Code:
    test=*# select to_timestamp(300 * (extract(epoch from ts) / 300)::int) , ts, value from stoni ;
      to_timestamp  |  ts  |  value
    ------------------------+---------------------+-------------------
     2016-03-09 19:00:00+01 | 2016-03-09 18:01:00 |  4.32290084660053
     2016-03-09 19:00:00+01 | 2016-03-09 18:02:00 |  4.98328131157905
     2016-03-09 19:05:00+01 | 2016-03-09 18:03:00 |  7.80218135099858
     2016-03-09 19:05:00+01 | 2016-03-09 18:04:00 |  6.93169048056006
     2016-03-09 19:05:00+01 | 2016-03-09 18:05:00 |  7.09824803285301
     2016-03-09 19:05:00+01 | 2016-03-09 18:06:00 |  9.30736531037837
     2016-03-09 19:05:00+01 | 2016-03-09 18:07:00 |  3.11400767881423
     2016-03-09 19:10:00+01 | 2016-03-09 18:08:00 |  4.01130246929824
     2016-03-09 19:10:00+01 | 2016-03-09 18:09:00 |  8.30512353219092
     2016-03-09 19:10:00+01 | 2016-03-09 18:10:00 |  1.36956706177443
     2016-03-09 19:10:00+01 | 2016-03-09 18:11:00 |  9.2077004397288
     2016-03-09 19:10:00+01 | 2016-03-09 18:12:00 |  2.60535518173128
     2016-03-09 19:15:00+01 | 2016-03-09 18:13:00 |  8.88555320445448
     2016-03-09 19:15:00+01 | 2016-03-09 18:14:00 |  6.9796333508566
     2016-03-09 19:15:00+01 | 2016-03-09 18:15:00 |  7.72524977568537
     2016-03-09 19:15:00+01 | 2016-03-09 18:16:00 |  9.54198599327356
     2016-03-09 19:15:00+01 | 2016-03-09 18:17:00 |  8.53903520852327
     2016-03-09 19:20:00+01 | 2016-03-09 18:18:00 |  9.72800097893924
     2016-03-09 19:20:00+01 | 2016-03-09 18:19:00 |  6.3117338437587
     2016-03-09 19:20:00+01 | 2016-03-09 18:20:00 |  4.00388177018613
     2016-03-09 19:20:00+01 | 2016-03-09 18:21:00 |  9.65917204972357
     2016-03-09 19:20:00+01 | 2016-03-09 18:22:00 |  2.50826773233712
     2016-03-09 19:25:00+01 | 2016-03-09 18:23:00 |  2.4416547967121
     2016-03-09 19:25:00+01 | 2016-03-09 18:24:00 |  1.32351371459663
     2016-03-09 19:25:00+01 | 2016-03-09 18:25:00 | 0.745902676135302
     2016-03-09 19:25:00+01 | 2016-03-09 18:26:00 |  9.89431032445282
     2016-03-09 19:25:00+01 | 2016-03-09 18:27:00 |  6.31013591773808
     2016-03-09 19:30:00+01 | 2016-03-09 18:28:00 |  3.22211087681353
     2016-03-09 19:30:00+01 | 2016-03-09 18:29:00 |  6.1841758294031
     2016-03-09 19:30:00+01 | 2016-03-09 18:30:00 |  7.2846427327022
    (30 rows)
    
    Nun gruppieren wir das:

    Code:
    test=*# select to_timestamp(300 * (extract(epoch from ts) / 300)::int) as zeit, avg(value) from stoni group by 1 ;
      zeit  |  avg
    ------------------------+------------------
     2016-03-09 19:00:00+01 | 4.65309107908979
     2016-03-09 19:05:00+01 | 6.85069857072085
     2016-03-09 19:20:00+01 | 6.44221127498895
     2016-03-09 19:30:00+01 | 5.56364314630628
     2016-03-09 19:25:00+01 | 4.14310348592699
     2016-03-09 19:15:00+01 | 8.33429150655866
     2016-03-09 19:10:00+01 | 5.09980973694474
    (7 rows)
    
     
  3. Stoni

    Stoni Benutzer

    Hi,

    ich glaube es liegt ein kleines Missverständnis vor.

    Die Originaldaten haben ziemlich lange Zeiträume (z.B. monatliche oder tägliche Ablesung). Diese Verbräche sollen linear auf kleine Zeiträume umgerechnet werden und in einer zweiten Tabelle abgelegt werden.

    Von kleinen auf große Zeiträume komme ich über den group by day. Die Frage ist wie komme ich von langen zeiträume auf lineare kleine Zeiträume?

    Gruß Stoni
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Also willst Du interpolieren? Google einfach mal danach.
     
  5. Stoni

    Stoni Benutzer

    Ja genau, das will ich. Leider finde ich kein Script. Hast Du nich einen Tip, nachw as man suchen kann?
    mysql interpolation leifert irgendwie kein brauchbasres Beispiel.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    hab sowas mal gesehen, aber für PostgreSQL. Mit den begrenzten Möglichkeiten von MySQL wird es wohl schwerer werden.
     
  7. Stoni

    Stoni Benutzer

    Ich bin bei der Datenbank nicht festgelegt.

    Bei MySQL habe ich nur einen Beispieldatenbank
     
  8. akretschmer

    akretschmer Datenbank-Guru

Die Seite wird geladen...
Ähnliche Themen - Verbräuche Zählerstände berechnen
  1. TomBoss
    Antworten:
    4
    Aufrufe:
    1.669

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden