Fragen: Auswertung einer Datenbank (Access) per SQL



  • hallo!
    nach verweis aus diesem forum-beitrag:

    [url]http://www.c-plusplus.net/forum/viewtopic-var-t-is-139419-and-postdays-is-0-and-postorder-is-asc-and-start-is-30.html
    [/url]

    ....poste ich nun in diesem forum hier:
    das problem,
    ich habe mehrere spalten welche messwerte (gleicher einheiten) von sensoren beinhalten. zusätzlich gibt es noch eine spalte mit der zeit und eine spalte mit dem datum zum zeitpunkt der messwertaufnahme.

    nun möchte ich den minimalwert (bzw. vom minimalwert bis zu einem definierten wert xmin, welcher zwischen minimalwert und maximalwert liegt) einer zeile (d.h. gleicher zeitpunkt) aus verschiedenen sensoren ermitteln.

    also allgemein: aus einer zeile mehrerer spalten einer tabelle einen minmalwert finden.

    danke



  • Das wird mit Sicherheit durch Gefummel funktionieren, aber das is sicher nicht der Sinn einer Datenbank. Bei deinem Problem hilft wohl nur Redesign deiner Datenbank um sich nichts zusammen zu frickeln.
    Mein Vorschlag wäre, dass du Messwerte als Extra Tabelle rausziehst und in die Tabelle dann folgende Spalten hast:

    Messwert
    ---------
    - ID
    - Messung_ID
    - Wert
    
    Messung
    -------
    - ID
    - Datum
    

    Somit kannst du
    a) unendlich viele Messwerte einer Messung hinzufügen und
    b) einfach über SQL die Daten auswerten:

    SELECT Min(Messwert.Wert), Messung.Datum
    FROM Messung, Messwert
    WHERE Messung.ID = Messwert.Messung_ID;
    


  • Bezug nehmend auf Deinen Start-Beitrag.

    Konstruktionsfehler DB !

    Zwei mögliche Ansätze:
    1. Möglichkeit
    den von CIN
    = Redesign der DB = Änderung DB + Frontend(s)
    allerdings mit z.T. anderen Spalten

    Table Messung
    - ROWID        -> immer eineindeutiger Zeilenindentifier in der Tabelle
    - Messung      -> Bezeichnung der Messung (ID)
    - Zeitstempel  -> Datetime mit Zeitanteil = Zeitpunkt der Messung
    
    Table Messwerte
    - ROWID         -> kennst Du nun schon
    - Messung       -> siehe oben
    - Sensor        -> ID des Sensors
    - Wert          -> Meßwert
    - Einheit       -> auf den sich der Wert bezieht -> Sowas kann isch ändern (z.B. durch Austausch eines Sensors)
    
    //einfacher Select ohne Umrechnung der Werte auf Basis der Einheit
    SELECT 
       MIN(MESSWERT.WERT),
       MESSWERT.SENSOR,
       MESSUNG.MESSUNG,
       MESSUNG.ZEITSTMPEL
    from MESSUNG, MESSWERT
    where MESSUNG.MESSUNG = MESSWERT.MESSUNG
    // falls nur ein bestimmter Sensor ausgewertet werden soll
    and MESSWERT.SENSOR = 'X'
    

    Ich habe hier absichtlich zum Verständnis "sprechende" Spaltenbezeichungen
    verwendet.

    2. Möglichkeit
    Erzeugen einer View = Gefrickel, aber schneller umgesetzt, jedoch langsamer in der Abarbeitung als geänderte DB

    Ich gehe davon aus, daß Deine Tabelle etwa so vorliegt

    Table Messwerte
    ROWID
    MESSUNG,
    DATUM,
    ZEIT,
    WERTSENSOR1,
    WERTSENSOR2,
    ....
    WERTSENSORX
    
    // View zur (Teil-)Normierung der Daten der Tabelle
    create VIEW MESSWERTEVIEW
    (MESSUNG,SENSOR,ZEITSTEMPEL,WERT,EINHEIT)
    select
    MESSUNG,
    'SENSOR1',    // da muß Deine Sensor-ID rein (im Moment wahrscheinlich Dein Spaltenname)  
    DATUM+ZEIT,
    WERTSENSOR1,
    'MilliWatt'  //  da muß Deine Einhiet rein
    from MESSWERTE
    
    union
    select
    MESSUNG,
    'SENSOR2',    
    DATUM+ZEIT,
    WERTSENSOR2,
    'MilliWatt'  
    from MESSWERTE
    
    ...
    union
    select
    MESSUNG,
    'SENSOR-X',    
    DATUM+ZEIT,
    WERTSENSORX,
    'MilliWatt'  
    from MESSWERTE
    
    SELECT 
       MIN(WERT),
       SENSOR,
       MESSUNG,
       ZEITSTMPEL,
       EINHEIT
    from MESSWERTVIEV
    where  ZEITSTMPEL =  DD.MM.YYYY HH:MM:SS //Ein Bestimmer Zeitpunkt
    // falls nur ein bestimmter Sensor ausgewertet werden soll
    and SENSOR = 'X'
    

    Bedenke, daß jede Änderung der Stuktur Ausgangstabelle, eine Änderung der View zur Folge hat!
    Bedenke weiterhin, daß es X+1 Select's sind, die ausgeführt werden müssen (X in View, 1 um View abzufragen) statt einem Select bei geänderter DB. Das kann zur Ausführungzeit merklich länger dauern als Möglcihkeit 1!



  • ich danke euch für eure ausfürhlichen antworten!
    werd mir das dann mal überlegen.

    thx



  • und mit euren vorschlägen ist es nun auch möglich, aus messwerten von sensoren bei einem bestimmten zeitpunkt das minimum herauszuholen, wobei es notwendig ist, zu wissen woher (von welchem sensor) der minimal wert stammt.

    danke



  • cin, bei deinem vorschlag für das redesign der db: es fehlt noch die zuordnung zu einem sensor.

    zum grundgedanke: alle sensoren werde zu einem bestimmten zeitpunkt gleichzeitig ausgelesen, d.h. zu einem zeitpunkt gibt es zu jedem sensor einen wert.

    thx



  • cin?



  • Hallo johny.

    Deine letzten Aussagen/Fragen waren rein rethorisch, oder?

    Andernfalls ... die Antworten auf diese Fragen stecken bereits in den Antworten von Cin und mir.


Anmelden zum Antworten