Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Max_werte von vielen Spalten ermitteln und die Spalte(mit dem Max_wert) ausgeben

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von balou1888, 25 März 2015.

  1. balou1888

    balou1888 Benutzer

    Hallo Profis,

    ich bin ganz neu in diesem Forum ich hoffe, dass Ihr mir vielleicht weiterhelfen könnt. Ich konnte kein ähnliches Problem hier im Forum ermitteln, deswegen erstelle ich ein neues Thema. Noch dazu, ich hab erst vor kurzem mit SQL und mySQL angefangen. Deswegen , werde ich nicht so viel wissen...


    Folgendes Problem:

    Im Rahmen meines Abschlusssemester(Projekts) meines Studiums (Mechatronik) messen wir Batterien über längere Zeiträume. Dabei nehmen wir Messwerte auf und speichern diese in eine Datenbank. Mir wurde jetzt die folgende Aufgabe gegeben:

    Es werden gleichzeitig 24 Messwerte (24 parallele Spalten) aufgenommen (+ der Zeitpunkt, wann es aufgenommen wurde) und in einer Datenbank auf einem Server gespeichert. Es ist halt eine MySQL Datenbank.

    Jetzt soll über SQL-Anfrage herausgefunden werden, welcher der Messwerte (von den 24 parallelen Messwertreihen) der Höchste ist, und diese Spalte soll angezeigt (geplottet) werden. Hinzu kommt noch, das nicht alle Werte angezeigt werden sollen, sondern nur die, für die man ein Zeitfenster ausgewählt hat. (Soll heißen: zeige mir alle Werte der letzen Stunde an. Oder: Zeige mir die Werte zwischen 10 und 11 Uhr an.)

    Was ich bis jetzt geschafft habe:

    Ich kann den Maximalwert der 24 Parallelen Messreihen ermitteln. Das mache ich so:

    SELECT GREATEST(
    MAX(spalte1), ..., MAX(spalte24)) FROM "tabelle") ;

    Das Problem ist jetzt, ich weiß nicht, zu welcher Spalte der Maximalwert gehört und auch nicht wie ich nur diese Spalte + Zeit-Linie(Spalte mit den Zeitpunkten) ausgeben lassen kann.

    Alles was ich bis jetzt versucht habe, führte zum "Syntax error" oder ging nicht.. oder zeigte die Spalten der Datenbank an, wo der Maxwert vorkam. Dabei wurden dann auch alle anderen Spalten angezeigt.

    Ich bin eigentlich ein C/C++ Programmierer (halt, das was man im Mechatronikstudium so macht) deswegen ist SQL und dessen Syntax nicht so geläufig.

    Ich hoffe, mein Problem ist verständlich rüber gekommen. Danke
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Dein Datenmodell ist für die Tonne, da es nicht skaliert. Was ist, wenn 25 Messwerte erfaßt werden sollen? Richtig, es platzt.

    Und Deine Frage ist nicht eindeutig. Was ist, wenn das Maximum mal in Spalte 3 und dann in Spalte 13 ist? Oder sollen immer die Maximalwerte genommen werden? Dafür hätte ich eine Lösung:

    Code:
    test=*# select * from blubb ;
     id | c1 | c2  | c3
    ----+----+-----+----
      1 | 10 |  20 | 30
      2 | 10 | 200 | 11
    (2 rows)
    
    Time: 0,199 ms
    test=*# select id, max(unnest) from (select id, unnest(array[c1,c2,c3]) from blubb group by id) foo group by id;
     id | max
    ----+-----
      1 |  30
      2 | 200
    (2 rows)
    
    Mal a) stark vereinfacht (stelle Dir id als der Timestamp vor) und b) mit PostgreSQL. Wird möglicherweise nicht 1:1 in Deiner Spielzeug-DB funktionieren, sorry.

    Das mit der Zeiteingrenzung ist ein dagegen trivialer Fall für das WHERE.
     
    balou1888 gefällt das.
  3. balou1888

    balou1888 Benutzer

    Hey,

    erstmal danke für deine Antwort.
    Die Datenbank(Messwerte_Tabelle) ist halt so vorgegeben. Das konnte ich mir nicht aussuchen.
    Das mit der Zeitbegrenzung und dem WHERE macht Sinn.

    Aber zu deiner Frage:
    Der Maximalwert kann mal in Spalte 3 und dann mal in Spalte 11 sein. Es sind ja Messungen und die Unterliegen natürlichen Schwankungen... Deswegen muss ja herausgefunden werden, welche Spalte für den betrachteten Zeitraum den höchsten Wert hat. (Wenn der Messwert eine gewisse höhe überschritten hat, wird es halt kritisch, deswegen will man sich das auch anschauen.)

    Ich versuche es nochmal zu erklären:

    1. 24 Messungen, jede Messung in einer Spalte der Tabelle ( alles wird gleichzeitig gemessen)
    2. Zeitfenster angeben.: z.b. Verlauf der letzen Stunde
    3. Ermittlung in welcher Spalte der Tabelle der höchste Werte ist. ( z.b Spalte 4 hat den höchsten Wert von 120, alle anderen Spalten erreichen keine 120..)
    4. Jetzt soll nur die Spalte 4 angezeigt werden (alle Werte der letzen Stunde, um den Verlauf ersichtlich zu machen).

    So in etwa soll die Abfrage in der Datenbank erfolgen, damit man sich den Messverlauf anschauen kann, der den Höchsten Wert hat.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Dann paßt ja meine Abfrage.
     
  5. balou1888

    balou1888 Benutzer

    vielen dank, ich hab es ein wenig abgeändert, aber es hat funktioniert. Aber PostgreSQL hab ich jetzt nicht verwendet.. Kenn mich da ja auch noch nicht so aus.. :)
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Na prima. Könntest Du die MySQL-Lösung auch zeigen? Kann ja sein, daß sich jemand dafür interessiert (ich nicht, da bin ich ehrlich...)
     
  7. balou1888

    balou1888 Benutzer

    Ich muss ehrlich sagen, das ich anfangs die Aufgabenstellung anders verstanden habe. Erst nach dem ich gestern noch mal mit meinem Vorgesetze darüber geredet hatte und er mir erklärt hat, wie das System und die Datenbank aufgebaut ist, konnte ich es umsetzen.

    Aufbau meiner Datenbank ist ca. so:

    | cabinet | string| modul| c1| c2 | ... | c24 | date

    Das Batterie-System ist an sich, ist etwas komplexer, deswegen lass ich das hier auch weg (und genauer darf ich darauf auch nicht eingehen). Meine Lösung :

    Code:
         SELECT date,  GREATEST(  MAX(c1), MAX(c2),  .. , MAX(c24) )
         AS mV FROM `table` GROUP BY date
    
    Gemessen wird jede Sekunde und mit GROUP BY date konnte ich die Werte von jeder Sekunde zusammenfassen. Und das wars.. Jetzt habe ich eine Liste mit allen Maxwerten jeder Sekunde...

    Wichtig: erstmal genau verstehen, was gewollt ist und nicht. Dann kann man sich an die arbeit machen und viel arbeit/zeit sparen..

    Danke für die Hilfe, mit deinem GROUP BY - Beispiel bin ich weiter gekommen..
     
    Hony% und akretschmer gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden