mysql Zählerstand berechnen


#1
Hallo
Ich möchte den Stromverbrauch in mysql berechnen lassen. Dazu habe ich eine Tabelle
Code:
nummer  zählerstand
1        26624.0  
2        31284.0  
3        37165.0  
4        40625.0  
5        40644.2  
6        40711.5
Nun brauche ich eine Spalte in dem der Verbrauch steht. Das ganze sollte so aussehen:
Code:
nummer  zählerstand verbrauch
1        26624.0      26624.0
2        31284.0       4660,0
3        37165.0       5881,0
4        40625.0       3460,0     
5        40644.2         19,2  
6        40711.5         67,3
Probiert habe ich es mit diesem Code aber es kommt das falsche Ergebnis.


Code:
SELECT t1.nummer, t1.zählerstand, SUM( t2.zählerstand - t1.zählerstand ) AS 'verbrauch'
FROM Stromverbrauch AS t1, Stromverbrauch AS t2
WHERE t1.nummer >= t2.nummer
GROUP BY t1.nummer
Hat mir jemand einen Tip wo der Fehler liegt?
Muß gestehen das ich nicht viel Ahnung von mysql habe und bin für jede Hilfe dankbar.
 
#2
Mir ist leider kein Konstrukt bekannt, dass man auf das nächste Tupel in der DB zugreifen kann.

Dein Ansatz mit dem Join ist zwar gut, aber auch nicht passend, denn du bekommst bei deinem momentan Join, 6!(6*5*4*3*2*1) einträge.

Wenn du aber sowas machen würdest:
Code:
WHERE t1.nummer+1 = t2.nummer
hättest du das Problem mit dem letzten Eintrag.

Um es kurz zu machen.
Es wäre besser du würdest noch eine Spalte Einfügen: alter Zählerstand.
Also: nummer, alter_Zählerstand, neuer_Zählerstand

Dann könntest du so eine schöne einfache Abfrage machen:

Code:
SELECT nummer, neuer_Zählerstand, (neuer_Zählerstand - alter_Zählerstand)  AS verbrauch
FROM Stromverbrauch
 

Biber2

Erfahrenes Mitglied
#3
Moin weissichkeinen,

kann dki nur zustimmen.

Ein Notbehelf unter der Voraussetzung, dass das Feld "Nummer" nie mit 0 (numerisch Null) ist wäre z.B.
SQL:
SELECT S1.nummer, S1.Zählerstand, 
s2.nextstand, s2.nextstand-s1.Zählerstand as Verbrauch
FROM 
( Select nummer, Zählerstand from Stromverbrauch 
 union all
select distinct 0, 0 from stromverbrauch ) s1, 
(select nummer-1 as nextnr, zählerstand as nextstand 
from stromverbrauch) s2 
where s1.nummer =s2.nextnr
Grüße
Biber
 
#4
Probiert habe ich es mit diesem Code aber es kommt das falsche Ergebnis.


Code:
SELECT t1.nummer, t1.zählerstand, SUM( t2.zählerstand - t1.zählerstand ) AS 'verbrauch'
FROM Stromverbrauch AS t1, Stromverbrauch AS t2
WHERE t1.nummer >= t2.nummer
GROUP BY t1.nummer
Hat mir jemand einen Tip wo der Fehler liegt?
Der Ansatz ist schon nicht schlecht, mit ein paar Verbesserungen funktioniert er auch:
SQL:
SELECT 
t1.nummer, t1.zählerstand, MIN(t1.zählerstand- IFNULL(t2.zählerstand, 0)) AS verbrauch
FROM Stromverbrauch AS t1
LEFT JOIN Stromverbrauch AS t2 ON (t1.nummer > t2.nummer)
GROUP BY t1.nummer
Wenn du sicherstellen kannst, dass es keine Lücken zwischen den Einträgen gibt, ginge auch das hier (evtl. effizienter)
SQL:
SELECT 
t1.nummer, t1.zählerstand, MIN(t1.zählerstand- IFNULL(t2.zählerstand, 0)) AS verbrauch
FROM Stromverbrauch AS t1
LEFT JOIN Stromverbrauch AS t2 ON (t1.nummer = t2.nummer + 1)
GROUP BY t1.nummer
Um es kurz zu machen.
Es wäre besser du würdest noch eine Spalte Einfügen: alter Zählerstand.
Also: nummer, alter_Zählerstand, neuer_Zählerstand
Das wäre aber nicht im Sinne der Normalisierung. Besser wäre es, wenn dann die nummer des vorherigen Eintrages zu speichern.

Grüße, Mattthias
 
#6
Hallo! Ich habe im gründe die gleiche Thematik, auch wenn der Post doch schon etwas älter ist.
Ich habe eine Tabelle in der laufend der Zählerstand, Unix Timestamp und eine ID eingetragen wird.
Nun möchte ich allerdings nur bestimmte Einträge von einander abziehen. Mein Ziel ist es zum Beginn und zum Ende des Tages den Verbrauch zu ermitteln.

Ich weiß leider nicht so recht, wie ich das in die Abfrage mit einbauen kann. Hat jemand dazu einen Tipp?
 

Yaslaw

n/a
Moderator
#7
Ist schwer zu sagen was du tun sollst, wenn wir keinerlei Angaben haben. Nur anhand der Idee muss ich sagen, die Lösung steht in diesem Thread. Wenn nicht, dann musst du mehr liefern. Ein Beispiel deiner Tabelle. EIn Beispiel wie das Resultat dann aussehen soll,