Export - Berechnung - Import von SQL-Daten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Algha
User
Beiträge: 10
Registriert: Mittwoch 24. Mai 2017, 10:13

Hallo zusammen,

ich bräuchte mal wieder Eure Hilfe :) Mit dem Import von CSV Dateien in eine SQL Datenbank hatte ja letztens schon perfekt geklappt. Nun steh ich aber vor der nächsten Aufgabe und weiß nicht so recht wie ich das ganze angehen soll.

In eine Datenbank werden regelmäßig Daten kopiert. Mit diesen Daten sollen verschiedene weitere berechnet werden. Da zum Teil auch mit Fallunterscheidung berechnet wird bin ich mir nicht so sicher ob man das die Datenbank selbst berechnen lassen sollte. Auch weiß ich nicht ob ich der Datenbank beibringen kann das diese Berechnung nachts durchgeführt werden soll.

So nun zu den Daten. Beispielsweise gibt es aller einer Minute die Daten A und B und C soll berechnet werden (der Import erfolgt zum Beispiel stündlich und mehrere verschiedene C's sollen berechnet werden. Meine Überlegung war nun die Daten A und B mir von der DB zu holen, zu berechnen und C in die DB zu schreiben (sollte ja über Arrays lösbar sein, Sinnvoll?). Da es immer wieder neue Daten gibt (über Jahre) muss die Berechnung zum Beispiel täglch durchgeführt werden. Wie könnte ich es nun lösen das nicht immer alles neu berechnet wird?

Hoffe man kann mich so halbwegs verstehen :)

Danke schon und schöne Feiertage euch allen
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Algha: man fragt die Datenbank nach allen A und B für die es kein C gibt. Wie das konkret geht, hängt halt davon ab, wie Dein Datenbankdesign aussieht. Auch kann ich mir kaum vorstellen, dass das Berechnen von C so aufwändig ist, dass man das nicht auch sofort machen kann, bei 60 Werten.
Algha
User
Beiträge: 10
Registriert: Mittwoch 24. Mai 2017, 10:13

Hallo Sirius,

da die Werte kontinuierlich auflaufen (also zum Beispiel aller einer Minute) könnte ich doch sicher auch abfragen in SQL wann der letzte Wert von C vorhanden ist und der letzte von A & B. Für diesen Zeitraum müsste dann berechnet werden.

Der Aufbau in der DB sieht grob so aus (einige Attribute fehlen)

Kanal --- Datum --- Value von Kanal
A --- 2017.12.12 23:23 --- Value von A für Berechnung
B --- 2017.12.12 23:23 --- Value von B für Berechnung
A --- 2017.12.12 23:24 --- Value von A für Berechnung
B --- 2017.12.12 23:24 --- Value von B für Berechnung



Mit Berechnungen in einer Datenbank kenne ich mich leider nicht aus. Die Formel an sich ist nicht schwer, aber halt mit ln, exp usw. Hier mal Beispielhaft auf die schnelle aus Excel kopiert:

=WENN(A11>0;(234,175*LN(610,78*EXP((17,08085*A11)/(234,175+A11))*B11/100/610,78)/(17,08085-LN(610,78*EXP((17,08085*A11)/(234,175+A11))*B11/100/610,78)));(272,44*LN(610,714*EXP((22,44294*A11)/(272,44+A11))*B11/100/610,714)/(22,44294-LN(610,714*EXP((22,44294*A11)/(272,44+A11))*B11/100/610,714))))


Mit welchem Modul arbeitet man am besten für die Speicherung der Daten aus der Datenbank, der Berechnung und anschließenden Import? Geht es da in die Richtung wie bei dem csv Modul?

Danke und Viele Grüße
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wieso willst du denn was speichern?

Und deine Berechnung ist jetzt nix was deine DB nicht gleich on-the-fly erledigen koennen sollte, ganz ohne Python. Was fuer eine DB benutzt du denn?
Algha
User
Beiträge: 10
Registriert: Mittwoch 24. Mai 2017, 10:13

Ja speichern war falsch ausgedrückt, meinte damit so etwas wie in Arbeitsspeicher laden für die Berechnung :)

Genutzt wird eine MySQL Datenbank.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na dann hier:

https://dev.mysql.com/doc/refman/5.7/en ... y-ref.html

findet sich alles, inklusive https://dev.mysql.com/doc/refman/5.7/en ... unction_if

Und ein bisschen googeln um rauszufinden wie man mit Python und MySQL arbeitet hast du bestimmt nur vergessen...
Algha
User
Beiträge: 10
Registriert: Mittwoch 24. Mai 2017, 10:13

Es war ja zu Beginn auch die Frage ob man das MySQL selbst berechnen lassen soll oder halt über Python :)

Frage kommt auch daher da es zum Teil schon Berechnungen gibt (mit Python 2 wo der Code aber für mich Bahnhof ist) und wieso dann dies so gemacht wurde und nicht mit MySQL direkt.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was die eigentliche Frage ist, kann ja nun keiner wissen, wenn du weder Kontext noch den bestehenden Code lieferst.

Und warum nun jemand eine bestimmte Entscheidung getroffen hat, das so oder so zu implementieren - das solltest du ggf. denjenigen selbst fragen.

Denn der Grund etwas im einen oder anderen zu machen hat natuerlich viel mit persoenlichen Vorlieben zu tun, und ggf ein paar technischen (aber weniger, als man denkt...). Es in Python zu machen lohnt sich dann, wenn man entweder kein SQL kann, und das nicht lernen will (persoenlich), oder wenn es in der DB schwieriger ist als in Python - was auch wieder viel mit Vorlieben und Kenntnissen zu tun hat. Das schoene Gleichnis dazu ist ja das bekannte "Wenn alles was du ist ein Hammer ist, sieht jedes Problem wie ein Nagel aus".

Was dein konkretes Problem angeht: wenn das in Excel (da nehme ich mal an kommt das her) geht, sollte das auch in der DB gehen.

In dem Moment, wo es siginifikante Mengen an Berechnungsschritten gibt mit eigenen Datenstrukturen und komplexer Logik, verschiebt sich das Ganze Richtung Programmiersprache. Aber fuer's gezeigte wuerde ich das in der DB machen.
Algha
User
Beiträge: 10
Registriert: Mittwoch 24. Mai 2017, 10:13

Fragen wie der Code funktioniert ist nicht mehr möglich. Warum er das ganze mit Python gemacht hat kann ich nur abschätzen das er Python vielleicht mehr mochte. Da er Programmierer war gehe ich mal von aus das auch SQL kein Problem gewesen wäre.

Ich selbst habe nur Erfahrung mit SQL was einfachere Abfragen betrifft. Ich wüsste jetzt zum Beispiel nicht wie ich in MySQL Summe von Value(kanal1) und Value (kanal2) berechne und als Value (kanal3) in die DB schreibe mit dem passenden Datum.

channel1 datum123 value
channel2 datum123 value

Daher der Gedanke das ganze mit Python zu versuchen und dadurch Python lernen. Mir würde ja eine Struktur helfen wie man vorgehen sollte am besten :)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

SELECT A + B FROM TABELLE;

Das wars. Wenn A und B in Tabelle sind. Wenn A und B aus einer komplexeren Abfrage rausfallen, ist das aber auch nicht anders.

Steht auch alles in der von mir verlinkten Dokumentation:

https://dev.mysql.com/doc/refman/5.7/en ... rator_plus

Kannst du sofort in deinem SQL-Frontend ausprobieren. Und dann dich weiter Vorarbeiten Schritt für Schritt bis die ganze Formel drin ist.

Wenn das steht, kannst du entscheiden ob du C immer berechnen willst, oder ob du es per INSERT oder UPDATE in die DB schreibst - die Ausdrücke funktionieren da auch.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Algha hat geschrieben:Da er Programmierer war gehe ich mal von aus das auch SQL kein Problem gewesen wäre.
Sehr gewagte Annahme. Die meisten Programmierer kennen SQL, wenn überhaupt aus Exceptions ihres ORMs.

Selbst bei den Leuten die SQL können hört es bei CTEs, subqueries und window functions schnell auf.
Antworten