Switch to full style
Hier werden die SQL Grundlagen behandelt...
Antwort erstellen

Differenz aus 2 bestimmten Zeilen ermitteln?

Do 14. Mär 2019, 16:57

Hallo Gemeinde

Ich bin Neuling was SQL und php angeht und habe mich daher hier im Forum registriert.
Aktuell verfolge ich folgendes Projekt:
In einer SQL Datenbank werden in einer Tabelle "measurement" alle paar Minuten die Zählerstände von bestimmten Zählern abgelegt, die verwendeten Spalten heißen SensorID, Value und AnswerDate.
Die Zählerstände (Value) sind fortlaufend, SensorID sagt aus, welcher Zähler gemeint ist und AnswerDate ist die jeweilige Zeit.
Nachdem ich nun ne Weile experimentiert habe schaffe ich es, die Zählerstände zu bestimmten Zeitpunkten und/oder zu bestimmten SensorIDs zu filtern und auch per html anzeigen zu lassen.

Wo ich hin möchte:
Am Ende der Geschichte soll eine Tabelle entstehen, bei der der stündliche Verbrauch der einzelnen Zähler zu sehen ist...Also als "Zeile" quasi 14.03.2019 06:00 - 07:00 Uhr, in der nächsten Zeile dann 14.03.2019 07:00 - 08:00 Uhr usw...
Die Spalten sollen dann mit den "SensorID"s beschriftet sein...also quasi ne Übersicht, welcher Zähler in welcher Stunde welchen Verbrauch hat...

Mein aktuelles Problem:
Ich kann zwar den "Value" der zur "SensorID" 1 gehört z.Bsp. für 06:00 Uhr filtern...(z.Bsp. SELECT VALUE FROM measurement WHERE (AnswerDate=gewünschter Zeitpunkt) And SensorID=1)
Genau das Gleiche kann ich dann natürlich für 07:00 Uhr machen....aber was dann?
Als Laie ausgedrückt: Irgendwie müsste ich die beiden "Values" abfragen, mir irgendwo merken und dann die Differenz daraus bilden...

Evtl. hat mir wer nen Tipp, wie ich das anstelle, bzw. welches die richtigen Begriffe für Google wären...hab vieles probiert und viel gegoogelt, aber iwie häng ich...

würde mich über hilfreiche Antworten sehr freuen...Danke

Re: Differenz aus 2 bestimmten Zeilen ermitteln?

Fr 15. Mär 2019, 08:38

Ich denke ich hab es hinbekommen, und zwar so:
Code:
SELECT (SELECT Round(Value,0) FROM measurement WHERE (AnswerDate<=$time2+3600) And SensorID=86 Order By AnswerDate DESC Limit 0,1) - (SELECT Round(Value,0) FROM measurement WHERE (AnswerDate=$time2) And SensorID=86) AS Differenz

Es funktioniert zumindest so für den Zähler mit der ID 86...time2 ist übrigens die volle zurückliegende Stunde, also quasi am 15.03.2019 um 7:34 Uhr würde time2 als 15.03.2019 7:00 Uhr gesetzt werden...

ich würde nun das gleiche manuell für alle anderen SensorIDs machen, dann hätte ich zumindest mal alle Verbräuche in der zurückliegenden Stunde => gibt es hier evtl. eine elegantere Möglichkeit?

Um die Stunden davor zu ermitteln müsste ich dann von der "time2" immer jeweils 3600 abziehen, auch hier die Frage, ob es evtl. eine elegantere Möglichkeit gibt?

Danke

Re: Differenz aus 2 bestimmten Zeilen ermitteln?

Fr 15. Mär 2019, 11:24

Hallo bajowa,

dein SQL-Statement wird evtl. für den einen Fall funktionieren, aber langfristig nicht sehr performant sein, da Du gerade SQL irgendwie zweckentfremdest :? (bitte nicht falsch verstehen).

Hast Du evtl. die Struktur (inkl. Datentypen) der Tabelle vorliegen? Kannst Du sie posten?
Was ich bis jetzt verstanden habe ist, dass du die Differenz für 1-n Sensor aus einer Start- bzw. Endzeit ermitteln willst.

Gruß,
SQLUnion

Re: Differenz aus 2 bestimmten Zeilen ermitteln?

Fr 15. Mär 2019, 13:47

Hallo SQLUnion
Danke für deine Antwort. Um ehrlich zu sein bin ich grad noch dabei herauszufinden, was ich da eigentlich mache :lol: Daher kann es gut sein, dass - auch wenn es jetzt für den ersten step funktioniert - ich da Mist baue :roll:
Bin daher über jede Hilfe dankbar...

Ich versuche mal die Sache als Laie zu erklären:
Ich habe SQL Datenbank in einem Datenlogger zur Verfügung, auf die ich mit HeidiSQL draufkomm...in dieser gibt es eine Tabelle "measurement" mit den Spalten "ID", "SensorID", "Value", "AnswerDate" und "RequestDate".
In dieser Tabelle werden alle 5 Minuten die Werte der jeweiligen Zähler abgelegt, wobei "SensorID" eben aussagt, welcher Zähler es ist...Value ist der Wert des jeweiligen Zählers und AnswerDate und RequestDate ist die Zeit des jeweiligen Zählerstandes...siehe Bilder measurement1 + measurement2 im Anhang

In einer weiteren Tabelle "sensor" erfolgt die Zuweisung der "SensorID" zu dem jeweils angeschlossenen Gerät.

Wo ich hin möchte:
Will eine Darstellung haben über die Anzahl an Zählungen innerhalb eines Zeitbereiches von einer Stunde, also etwa so wie in dem Bild "Wunschvorstellung" ...im idealfall dann unten noch einen "Vor" und "Zurück" Button, mit dem ich die Tage wechseln kann...

Meine Vorgehensweise als Laie:
Ich habe mir erstmal was gebastelt, um die aktuelle Zeit + Datum zu ermitteln...dann bastel ich mir eine "time2", die das aktuelle Datum und als Uhrzeit die zurückliegende volle Stunde hat...also heute um 12:24 Uhr wäre time2 dann heute um 13:00...

Dann versuche ich zu ermitteln, wie der Zählerstand einer bestimmten SensorID um 12:00 war und wie er aktuell ist...das mache ich mit "time2+3600", was ja dann 13:00 Uhr heute wäre...da es aber noch nicht 13 Uhr ist sondern erst 12:24, suche ich nach allen Werten die vor 14 Uhr abgelegt wurden, sortiere diese und suche mir den, der die "höchste" Zeit hat...wäre dann in meinem Beispiel der von 13:20 Uhr, weil ja alle 5 Minuten geloogt wird...

Dann bilde ich die Differenz aus den beiden Werten und habe damit die Anzahl an Takten zwischen 13:00 Uhr und 13:20 Uhr...

Soweit meine Laienhafte Logik...

Ich hoffe, ich konnte das halbwegs verständlich ausdrücken und bitte um Nachsicht, falls mein Ansatz zu kompliziert oder gar völlig falsch ist ;)
Bin leider absolut befreit von Vorkenntnissen und hab eben mal versucht, mit viel gegoogel mir die Sache zusammenzureimen...

Würde mich sehr über jede Hilfe freuen :)
Dateianhänge
Wunschvorstellung.jpg
measurement2.jpg
measurement1.jpg

Re: Differenz aus 2 bestimmten Zeilen ermitteln?

Fr 15. Mär 2019, 14:08

sorry, habe oben einen Tippfehler:

Ich habe mir erstmal was gebastelt, um die aktuelle Zeit + Datum zu ermitteln...dann bastel ich mir eine "time2", die das aktuelle Datum und als Uhrzeit die zurückliegende volle Stunde hat...also heute um 12:24 Uhr wäre time2 dann heute um 13:00...das müsste natürlich dann 12:00 Uhr heißen...
Antwort erstellen