Verbräuche aus Zählerstände berechnen

Stoni

Benutzer
Beiträge
5
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:
Werbung:
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)
 
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
 
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.
 
Werbung:
Zurück
Oben