MySQL: Datensätze vernünftig zusammenführen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von Linkai.

    MySQL: Datensätze vernünftig zusammenführen

    Hallo liebe Community,
    folgendes Problem:

    Ich habe in einer Tabelle eine Spalte vom Typ DateTime.
    Ich möchte nun in meiner Win-Forms Anwendung einen Zeitraum angeben: Datum1 Datum2
    Nun habe ich das Problem, dass ich zwischen bspw. 3 Tagen rund 1mio Datensätze habe. Bis diese im Chart zur visualisierung geladen sind vergeht ne ganze Zeit. Nun bin ich am überlegen wie ich die Datensätze am besten zusammenfassen kann.

    Ein Datensatz ist so aufgebaut:

    Id Stromwander_id phase1 phase2 phase3 time

    Es handelt sich hierbei um eine Tabelle mit Messwerten von Produktionsmaschinen, welche über 3 Phasen verfügen anstatt über eine.
    Derzeit lade ich nur eine Phase (Phase1) da ich dort bereits eine Millionen Datensätze habe. Ich überlege nun, wie ich die Messwerte am besten darstellen kann.
    3 Tage (vllt ne Tagesansicht) wo ich alle Werte miteinander addiere und dann nur das Ergebnis in einem Punkt ausgebe? dann hab ich nur 3 Punkte aber wie bekomme ich die Zellen addiert, bevor Sie sich in meinem Programm befinden, da ich bei 1 Mio Datensätze rund 1,4 GB Ram verbrauche.
    Wenn ich das nun mit ner Jahresansicht mache, dann dauerts ja Tage bis das geladen wäre..
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:
    Für mich ein gutes Beispiel für den Fall, wo das Dataset am Client und alle Daten am Client halten und filtern und berechnen nicht mehr (möglich) praktikabel ist.

    Du kannst das ganze in einer Stored Procedure an einem entsprechend dimensionierten SQL Server "relativ" schnell ausrechnen lassen. SQL Server sind genau für diese Datenmengen gedacht.

    Die ausgerechneten, gefilterten Daten kannst du dann natürlich wieder in ein typ. Dataset laden.
    Das ist meine Signatur und sie wird wunderbar sein!
    Ich habe derzeit die eine MySQL-Datenbank bei mir aufm Rechner mit Xampp installiert. Die Frage ist nun, wie bewege ich den Server von meinem Client aus dazu die Zellen zu Addieren und das Ergebniss danach an den Client weiterzugeben.


    EDIT# Okay hab gerade dazu was gefunden: dev.mysql.com/doc/connector-ne…ls-stored-procedures.html
    ich les es mir mal durch :) und danke für den Hinweis :)
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:
    okay ich habe nun versucht eine Prozedur zu erstellen, bekomme allerings immer einen Syntaxfehler beim Speichern ausgeworfen...?

    SQL-Abfrage

    1. CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`(IN `DateBegin` datetime,IN `DateEnd` datetime,IN `collu` varchar)
    2. BEGIN
    3. SELECT SUM(collu) as mSumme FROM 'messung' WHERE 'time' between DateBegin and DateEnd;
    4. END;;

    Was wird denn da falsch sein?
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:
    Unabhängig vom Syntax wäre
    SELECT SUM(collu) as mSumme FROM 'messung' WHERE 'time' between DateBegin and DateEnd;

    kein ausreichend komplexer Fall für eine Stored Procedure.

    hier eine glaub ganz gute Anleitung für eine SP in MySQL über die MySQL Console.
    dev.mysql.com/doc/refman/5.7/en/create-procedure.html
    Das ist meine Signatur und sie wird wunderbar sein!
    Okay, ich hab es nun hinbekommen die Datensätze zu einem Ergebnis zusammen zu zählen.. nun brauch ich aber mehrere und weiß nicht genau wie ich das anstellen soll.

    Wenn der Benutzer seine beiden Daten Von und Bis festgelegt hat, möchte ich filtern wie groß der Abstand ist.

    ist es der Gleiche Tag will ich die anzeige auf 24 Punkte beschrenken, alle punkte zwischen jeder stunde zusammen zählen bis der tag voll ist.
    Wenn das 2 Tage sind, dann natürlich 48 punkte für beide.
    Ab dem 3. Tag will ich dann eine Tagesansicht. Alle Punkte pro Tag addieren.
    Bis zur Monatsansicht, welche nach ab 3 Monate anfangen soll.
    so das ganze bis zur Jahresansicht. Hat wer ne idee wie ich das am gescheitesten hinbekomme? ich zermater mir da total die birne >.<..
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:
    ein problem ist immer, das problem ühaupt richtig zu verstehen.

    Kann es sein, dass du in deim Chart sagenwirmal 24 Punkte anzeigen willst?
    Und jeder Punkt soll einen Mittelwert des Zeitbereiches darstellen, den er absteckt?

    Und die Gesamt-Distanz des Zeitbereiches gibt der User vor, die Teil-Zeitbereiche ergeben sich halt daraus (etwa 1/24)?#

    Wie gesagt - das soll jetzt keine Lösung sein, sondern nur ein Versuch, das Problem überhaupt zu formulieren.
    Hey ihr beiden, tut mir leid, dass ich mich noch nicht bei euch gemeldet habe. Ich hatte Freitag Berufsschule und danach lag ich das Wochenende über krank im Bett.

    Also ich habe ein Chart, welches Datensätze aus einer Datenbank als Liniendiagramm visualisiert ausgeben soll. Pro Tag gibt es nun allerdings rund 800.000 - 1.000.000 Datensätze.
    Pro Datensatz gibt es 3 Spalten die ausgegeben werden müssen.

    Phase 1 - Phase 2 - Phase 3

    Es handelt sich hierbei um Messwerte des Themas Stromverbrauch von Produktionsmaschinen. (alle 5 Sekunden werden die Stromwandler ausgelesen und die Daten werden gespeichert)

    Der Kunde soll nun die Maschine und einen Zeitraum auswählen können, von dem er die Messwerte ausgegeben bekommt. Wenn er jetzt angenommen Maschine 1 auswählt und die Zeitspanne
    20.11.2015 15:25 bis 23.11.2015 10:00 auswählt, soll er die Messerwerte für den Zeitraum ausgegeben bekommen.
    Das funktioniert nur sind es (falls der Nutzer die Ergebnisse aller Maschinen ausgeben lassen möchte) viel zu viele Punkte und Daten die angezeigt werden würden, sodass der Rechner :
    1. Ewigkeiten zum laden bräuchte
    2. Der Arbeitsspeicher in wenigen Augenblicken aufgrund der horenden Datenmengen überlaufen würde.
    Und ich spreche hier nur von 3 Tagen. Was passiert also wenn der Kunde gleich die letzten 2 Jahre sehen will?
    Deshalb hab ich mir etwas überlegt, wo ich nicht weiß wie ich es bewerkstelligen soll. Verschiedene Ansichten.

    In dem oben genannten Fall würde ich eine Tagesansicht ausgeben. Alle Punkte / Tag addieren und wieder ausgeben.
    Wenn der Kunde 2-3 Jahre ausgeben möchte natürlich eine Jahres ansicht (vllt auch noch ne Monatsansicht da es sich dabei nur um 24-32 Punkte handelt). also auch hier wieder Punkte / Jahr addieren und ausgeben.

    Nun habe ich 2 Probleme. Wie kann ich nach diesen Kriterien den Server dazu bewegen die Punkte für mich zusammen zu zählen und wie zerlege ich am besten den DateTime-String so, dass ich die ansichten realisiere. Ich habe das ganze mit IF-Blöcken versucht aber weiß nicht genau wie ich das jetzt machen soll.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. If DateTimeUntil.Year - DateTimeFrom.Year <= 0 Then
    2. If DateTimeUntil.Month - DateTimeFrom.Month <= 0 Then
    3. If DateTimeUntil.Day - DateTimeFrom.Day <= 0 Then
    4. If DateTimeUntil.Hour - DateTimeFrom.Hour <= 0 Then
    5. Else
    6. End If
    7. Else
    8. End If
    9. Else
    10. End If
    11. Else
    12. End If



    EDIT: Okay ich habe nun diese IF-Blöche zur automatischen Berechnung der View entfernt. Der Nutzer bekommt nun eine ComboBox mit Möglichkeiten zur Auswahl ob er die Werte in Sekundensteps haben möchte, USW.

    Das Problem bleibt aber nachwievor: Die Punkte zusammen zählen, aber wie? Serverside wäre wohl schneller.
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Linkai“ ()

    mir nützlich wäre zu erfahren, was du zu meinen Überlegungen in post#9 sagst - ob du die verstehst, ob die Quatsch sind, ob ich dich falsch verstanden habe, und inwiefern und solche Sachen.

    Stichwort "Kommunikation" ;)

    Dass mehr Daten da sind, als verarbeitet werden können, war mir bereits bekannt (wenn ich's richtig verstanden habe)

    ErfinderDesRades schrieb:

    Kann es sein, dass du in deim Chart sagenwirmal 24 Punkte anzeigen willst?
    Und jeder Punkt soll einen Mittelwert des Zeitbereiches darstellen, den er absteckt?

    Und die Gesamt-Distanz des Zeitbereiches gibt der User vor, die Teil-Zeitbereiche ergeben sich halt daraus (etwa 1/24)?#

    wenn der Nutzer von den letzten 24 stunden die Ergebnisse bekommen will muss er zB. 22.11.2015 14:30 bis 23.11.2015 14:30 Uhr auswählen.
    Nun soll das Programm für die Stundenanzeige folgendermaßen die Punkte addieren:

    22.11.2015 14:30 -22.11.2015 15:30 = 1. punkt
    22.11.2015 15:30 - 22.11.2015 16:30 = 2. punkt
    .....
    so sollen dann die eizelnen Werte Stundenweise errechnet und ausgegeben werden.
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:
    Nun ich würde festelgen wie detailiert der User die Daten angezeigt bekommt. Ich habe auch versucht so etwas zu Lösen.
    Jedoch wollte ich die Punkte nicht so wie du Pro Stunde sondern Pro Tag. Dazu habe ich mir eine Temporäre Tabelle in einer Stored Procedure gemacht.

    Hier sieht man wie ich jeden Tag zwischen einer Zeitspanne in eine Teporäre Tabelle speichere. (MS SQL)

    SQL-Abfrage

    1. --Create temporary Date Table
    2. CREATE TABLE #myDates
    3. (
    4. DateValue Date
    5. )
    6. --Fill temporary table with datevalues
    7. WHILE (@StartDate<=@EndDate)
    8. BEGIN
    9. INSERT INTO #myDates
    10. VALUES (@StartDate )
    11. SELECT @StartDate = DATEADD(DD,1,@StartDate)
    12. END


    Danach habe ich meine Werte Tabelle mit dieser Temporären Tabelle mit einem LEFT JOIN verbunden. (MS SQL)

    SQL-Abfrage

    1. SELECT
    2. ISNULL([COUNT], 0) AS 'Count',
    3. CONVERT(Date, d.DateValue) AS 'Date'
    4. FROM
    5. #myDates d
    6. LEFT JOIN
    7. tLogHistory lh
    8. ON lh.Date = d.DateValue


    Am Schluss der Prozedur habe ich dann die Temporäre Tabelle gelöscht. (MS SQL)

    SQL-Abfrage

    1. DROP TABLE #myDates


    Ich hoffe du verstehst das Prinzip.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Lingo“ ()

    Erstmal danke für deine Mühe, die Idee ist bei mir definitiv angekommen und stößt auch auf interesse, danke auch dafür!

    Die sache mit dem Festlegen ist so ne sache: Es ist nunmal die anforderung die gestellt worden. Mir wurde soeben mitgeteilt , dass der Benutzer nun sogar noch mehr Freiheit haben soll und will.

    Er soll die Maschine auswählen können und dann deren Stromwandler.
    Als nächstes den Zeitraum (DateTime 2x), und die Anzeige-Variante (Jahr,Monat, Tag, Stunde, Minute) und dann zusätzlich auch noch den Intervall ...-.- also alle 5 minuten, alle 10 minuten, jedes Jahr alle 3 Jahre, alle 4 Monate... what ever...

    -.-"
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:
    Halte ich nicht für eine gute Idee, und wird auch dem User selbst nicht soo viel spass machen, da endlos herumklicksen zu dürfen.

    Imo hätte er doch mehr Freude daran, wenn er einfach den Stromwandler wählt, und dann einen Zeitraum.
    Alles andere sollte die Logik machen, und dabei müsste eine schlaue Mittelwertbildung zum Zuge kommen, wenn im Zeitraum mehr Daten angefallen sind, als zu verarbeiten Spass macht.
    Herauskommen sollte ein LinienChart, evtl. mit mehreren Series.

    Was dabei herauskommt, wenn der User 22.11.15: 14:50 - 23.11.15: 18:00 auswählt, Variante Monat, Intervall alle 3 Jahre, kann ich mir nicht vorstellen - ergibt imo kein Sinn.

    ErfinderDesRades schrieb:

    Was dabei herauskommt, wenn der User 22.11.15: 14:50 - 23.11.15: 18:00 auswählt, Variante Monat, Intervall alle 3 Jahre, kann ich mir nicht vorstellen - ergibt imo kein Sinn.


    Es werden natürlich dann nur die Dinge zur Auswahl angeboten, die in den Zeitraum hineinpassen. Ist der Zeitraum zwischen den Beiden kleiner als 2 Jahre, wird die Jahresansicht garnicht erst zur Auswahl stehen.
    Ich kann ja an der Sache auch nichts ändern. Ich kommuniziere nicht selbst mit dem Kunden, ich bekomme lediglich meine Aufgabe ;)

    Trotzdem danke euch allen erstmal für eure Mühe :)
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:
    Dies ist mir durchaus bewusst, mein Chef ist meiner Auffassung ebenfalls bewusst, jedoch möchte er das der Kundenwunsch so erfüllt wird, wie aufgetragen wurde. Bin eben in der gemeinen Welt der Wirtschaft nur ein Sklave :D
    Normalerweise würde ich das ganze ebenfalls automatisiert berechnen lassen. naja
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love: