BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Zwischenwerte berechnen -- Grenzen einer Datenbank?

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
mepi0011
Beiträge: 5
Registriert: Fr 30. Dez 2011, 12:54

Zwischenwerte berechnen -- Grenzen einer Datenbank?

Beitrag von mepi0011 » Fr 30. Dez 2011, 14:56

Hallo,
ich erstelle zur Zeit eine HSQLDB Datenbank mit der ich meinen Stromverbrauch ermittle. Hierzu habe ich die letzten Jahre immer am Montag den Stromzähler abgelesen und die Werte notiert.

Nun würde ich mit den Daten gerne eine Monatsauswertung erstellen. Leider fällt der Montag nicht immer auf den ersten des Monats. Theoretisch könnte ich mit diesen Wert berechnen da ich immer am Monatsende und Anfang des nächsten Monat Werte habe.

Beispiel:
28.06.2011 = 5442,9 kWh
05.07.2011 = 5450,3 kWh

Mittlerer Verbrauch je Tag zwischen 28.06 und 05.07.2011 = (5450,3 kWh - 5442,9 kWh) / 7 Tage --> 1,056 kWh je Tag

Fiktiver Wert am 01.07.2011 = 5450,3 kWh - 1,056 kWh/Tag * 4 Tage

Kann so etwas mit einer Datenbankabfrage realisiert werden oder welche Möglichkeiten gibt es?

Gruß
mepi0011

F3K Total
Beiträge: 2410
Registriert: So 10. Apr 2011, 10:10

Re: Zwischenwerte berechnen -- Grenzen einer Datenbank?

Beitrag von F3K Total » Mo 2. Jan 2012, 02:28

Hallo,
ja, das ist möglich, ist allerdings alles andere als banal.
Die eingebettete HSQL DB verfügt nicht über alle Befehle, zum Beispiel fehlt DATEADD.

Als Beispiel und Anfang mal eine SQL-Abfrage die dir den Durchschittsverbrauch zwischen zwei Ablesedaten errechnet:
Angenommen Du hast eine Tabelle 01_Ablesungen mit den Spalten ID, Datum, Zaehlerstand, dann sieht das Ergebnis dieser SQL-Abfrage

Code: Alles auswählen

SELECT X."Zaehlerstand", X."Datum"  AS "Start", Y."Datum" as "Ende", ( Y."Zaehlerstand" - X."Zaehlerstand" ) / CONVERT(DATEDIFF( 'DD', X."Datum", Y."Datum" ),"DOUBLE") AS "Durchschnitt_zwischen_Ablesungen" FROM "01_Ablesungen" as X, "01_Ablesungen" as Y WHERE X."ID" = Y."ID" -1
z.B. so aus:
ZST.png
ZST.png (7.01 KiB) 5863 mal betrachtet
Damit läßt sich dann weiterrechnen ...
Gruß R
Windows 10: AOO, LO Linux Mint: AOO, LO

mepi0011
Beiträge: 5
Registriert: Fr 30. Dez 2011, 12:54

Re: Zwischenwerte berechnen -- Grenzen einer Datenbank?

Beitrag von mepi0011 » Mo 2. Jan 2012, 22:25

Hallo F3K Total,

vielen Dank für die Hilfe! :D

Ich habe dein Beispiel mit meiner Tabelle nachvollzogen und bin gleich auf das nächste Problem gestoßen, das ich bis jetzt nicht lösen konnte.

In meiner Tabelle 01_Ablesung (siehe Dateianhänge Daten.csv.zip) habe ich die Spalten Datum (Index) und HT (entspricht Zählerstand)

Die zugehörige SQL Abfrage sieht wie folgt aus:

Code: Alles auswählen

 SELECT
"X"."Datum" AS "Start",
"Y"."Datum" AS "Ende",
DATEDIFF( 'DD', "X"."Datum", "Y"."Datum") AS "Tagesdifferenz",
"Y"."HT" - ( "Y"."HT" - "X"."HT" ) / DATEDIFF( 'DD', "X"."Datum", "Y"."Datum" ) * (DAYOFMONTH("Y"."Datum") - 1)AS "HT_Monatsanfang"
FROM
"Grunddaten" AS "X",
"Grunddaten" AS "Y"
WHERE "Tagesdifferenz" BETWEEN 1 AND 7 AND
DATEDIFF( 'mm', "X"."Datum", "Y"."Datum" ) = 1;
beziehungsweise die Ausgabe:
Ausgabe.png
Ausgabe.png (12.91 KiB) 5843 mal betrachtet
Da ich den Zähler nicht jede Woche am gleichen Tag ablese, sondern manchmal auch öfters, habe ich mehrere Werte für den Monatsanfang in meiner Abfrage.
z.B. habe ich den Eintag in der Spalte "Ende" am 02.03.09 und 01.03.09 so wie am 06.04.09 und 01.04.09 relevant ist für mich nur der 01.03 und der 01.04.
Ich bekomme es einfach nicht hin, diese Einträge zu filtern.

Hat jemand eine Idee wie ich meine Abfrage ändern muss un folgende Ausgabe zu bekommen:
Start Ende Tagesdifferenz HT_Monatsanfang
23.02.09 01.03.09 6 3573,9
30.03.09 01.04.09 2 3803,4
27.04.09 04.05.09 7 3873,3
25.05.09 01.06.09 7 3962,0
...

Vielen Dank im Voraus!

Gruß
mepi0011
Dateianhänge
Daten.csv.zip
(881 Bytes) 268-mal heruntergeladen

F3K Total
Beiträge: 2410
Registriert: So 10. Apr 2011, 10:10

Re: Zwischenwerte berechnen -- Grenzen einer Datenbank?

Beitrag von F3K Total » Mi 4. Jan 2012, 20:45

Hallo,
ich habe eine Spalte ID in deine Daten eingefügt und die letzten vier Zeilen gelöscht, dann geht folgende Abfrage im Direkt-SQL-Mode:

Code: Alles auswählen

SELECT cast(year("Y"."Datum")||'-'||casewhen(month("Y"."Datum")<10, '0'||month("Y"."Datum"),''||month("Y"."Datum"))||'-01' as DATE) "Datum",
Y."HT"-((dayofmonth("Y"."Datum")-1)*cast((Y."HT"-X."HT")as double)/Datediff('DD',"X"."Datum","Y"."Datum")) as "HT_Monatsanfang"
FROM
"Grunddaten" AS "X",
"Grunddaten" AS "Y"
where X.ID = Y.ID-1 and 
(month(Y."Datum")-month(X."Datum")=1 or(month(X."Datum")-month(Y."Datum")=11))
Zur Erklärung:
Durch X.ID = Y.ID-1 werden nur aufeinanderfolgende Datumspärchen gefunden.
Durch (month(Y."Datum")-month(X."Datum")=1 or(month(X."Datum")-month(Y."Datum")=11)) werden daraus wiederum nur die Pärchen gefunden, bei denen sich die Monate um eins unterscheiden, die 11 ist für den Jahresübergang (12-1).
Zu diesen Daten gehören die Ablesewerte X."HT" und Y."HT" und eine Tagesdifferenz Datediff('DD',"X"."Datum","Y"."Datum")
(Y."HT"-X."HT")/Datediff('DD',"X"."Datum","Y"."Datum") ergibt den Tagesdurchschnitt
(dayofmonth("Y"."Datum")-1) multipliziert mit dem Tagesdurchschnitt wird nun vom Y."HT" abgezogen
Die Spalte cast(year("Y"."Datum")||'-'||casewhen(month("Y"."Datum")<10, '0'||month("Y"."Datum"),''||month("Y"."Datum"))||'-01' as DATE) "Datum" erzeugt das Monatsanfangsdatum.
So,
viel Spaß damit
Gruß R

Edit: nachträglich (Y."HT"-X."HT") durch cast((Y."HT"-X."HT")as double) ersetzt -> Berechnung genauer
Edit2: natürlich würde auch DATEDIFF( 'mm', "X"."Datum", "Y"."Datum" ) = 1 für die Monatspärchen gehen, habe aber gemerkt, dass die Berechnung dadurch deutlich langsamer wird.
Dateianhänge
Daten.zip
(1.11 KiB) 293-mal heruntergeladen
Windows 10: AOO, LO Linux Mint: AOO, LO

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten