SQL ?

Dieses Thema SQL ? im Forum "Webentwicklung, Hosting & Programmierung" wurde erstellt von Fizbin, 8. Juli 2004.

Thema: SQL ? Hallo. Ich bin grade dabei eine kleine Datenbank zu planen, in der Messwerte gespeichert werden und mit einem zum...

  1. Hallo.

    Ich bin grade dabei eine kleine Datenbank zu planen, in der Messwerte gespeichert werden und mit einem zum Zeitpunkt der Messung aktuellen Kalibrationsfaktor in Beziehung stehen sollen.

    In einer Tabelle Messungen sollen in der einen Spalte Messwerte und in der anderen Spalte ein Timestamp als Primärschlüssel gespeichert werden.

    Die Messwerte in dieser Tabelle enthalten jedoch noch nicht die endgültigen Messwerte.
    Um ein entgültiges Ergebnis zu erreichen müssen diese Werte mit einem Kalibrationsfaktor multipliziert werden, der sich von Zeit zu Zeit ändert (Eine Kalibration wird in unregelmässigen (Wochen-)Abständen durchgeführt).

    Der Kalibrationsfaktor befindet sich, zusammen mit einem Timestamp der Kalibration als Primärschlüssel, in der Tabelle Kalibration.

    Mein Problem ist nun eine SQL-Abfrage zu finden, die eine gespeicherte Messung mit dem zu diesem Zeitpunkt gültigen Kalibrationsfaktor multipliziert.


    Beispiel:

    Tabelle Messungen:
    Code:
    07.07.2004 16:19:32    20
    07.07.2004 16:20:32    21
    07.07.2004 16:21:32    26
    .
    .
    .
    08.07.2004 13:14:50    33
    08.07.2004 13:15:50    50
    08.07.2004 13:16:50    53
    08.07.2004 13:17:50    55
    08.07.2004 13:18:50    77
    
    Tabelle Kalibration
    Code:
    06.07.2004 12:55:41    0,25
    08.07.2004 10:09:11    0,5
    

    Das Ergebnis einer Abfrage sollte dann ungefähr so aussehen:
    Code:
    Timestamp (Messung)    Messwert         Faktor         Ergebnis
    
    07.07.2004 16:19:32        20         0,25  5
    07.07.2004 16:20:32        21         0,25  5,25
    .
    .
    08.07.2004 13:18:50        77          0,5   38,5
    
    Ist das via SQL überhaupt möglich eine Abfrage so zu gestalten, oder muss ich die gesammte Kalibrationstabelle laden und und mir per php, etc. den (zum Zeitpunkt der Messung) entsprechenden Kalibrations-Datensatz raussuchen?

    Oder muss ich eine ID als Primärschlüssel der Kalibrationstabelle, die ich dann in der Tabelle Messungen als Sekundärschlüssel führe?

    Oder wäre es dann nicht gar geschickter den Kalibrationsfaktor gleich in der in der Messungen-Tabelle zu speichern, obwohl eine 1 zu n Beziehung vorliegt?

    Danke für Hilfe.

    Gruß Fizbin
     
  2. hi

    ich würde bei den kalibrierdaten eine tabelle festlegen die drei werte beinhaltet (Timestamp_von, Timestamp_bis, Korrekturfaktor)
    und diese fortlaufend benennen z.b. t1, t2, t3...(tn)

    bei der berechnung der messwerte dann dort eine routine die ermittelt in welchem gültigen zeitfenster (per datumsvergleich) die kalibrirdaten stehen.

    beim kalibrieren selbst wird dann der aktuelle (tn) Timestamp_bis geschrieben
    und gleichzeitig ein neuer (tn+1) angelegt und gleich Timestamp_von hineingeschrieben + den neuen kalibrierfaktor

    in die routine würde ich noch eine fehlerausgabe implementieren, die ausgibt
    keinen gültigen Kalibrierwert gefunden
    falls für den messwert kein korrekturfaktor im zugeordneten zeitraum zur verfügung steht.

    Xcross
     
  3. Das mit den von- bis- Timestamps hört sich auch praktikabel an.


    >bei der berechnung der messwerte dann dort eine routine die ermittelt in welchem gültigen zeitfenster (per datumsvergleich) die kalibrirdaten stehen.

    Aber bekomme ich so eine Abfage nur mit SQL garnicht hin? Muss ich wirklich eine Routine mittels PHP, VB, etc schreiben?

    >in die routine würde ich noch eine fehlerausgabe implementieren, die ausgibt keinen gültigen Kalibrierwert gefunden falls für den messwert kein korrekturfaktor im zugeordneten zeitraum zur verfügung steht.

    Naja, vor der allerersten Messung ist halt eine Kalibration durchzuführen. Die ist dann gültig (bis zur nächsten Kalibration).
     
  4. hi

    ganz klar ist mir die sache noch nicht was das für eine anwendung ist und wie sie dargestellt werden möchte.
    ich betrachte mich selbst als blutiger anfänger was das hier angeht, habe auch erst in php reingeschnuppert (sql dann etwas später)

    mit sql (mysql?) werden ja die entspechenden daten aus den datensätzen herausgefiltert diese zwar zeilenweise angezeigt.
    aber das gültige messergebnis muss doch noch aus messwert und korrekturfaktor errechnet werden (geht das denn mit sql?)

    für eine gute darstellung, die auch graphisch sein kann denke ist php sicher ne gute lösung dafür.

    Xcross
     
  5. hp
    hp
    hier http://www.w3schools.com/sql/default.asp kannst du mal was über sql nachlesen. mit hilfe von funktionen kann man auch sachen berechnen lassen, kommt natürlich auch darauf an, welche db genommen wird..

    greetz

    hugo
     
  6. Hallo

    @XCross
    Die Datenbank soll Werte eines A/D-Wandlers speichern. An dem AD-Wandler sind Temperatur- und PH-Wert-Sonden angeschlossen. Die Messwerte sind Bytewerte die mittels der Kalibrierfaktors in echte °C und PH-Werte umgewandelt werden müssen.
    Diese Kalibrationsfaktoren ändern sich von Zeit zu Zeit.

    Einige Berechnungen gehen auch mit SQL (s.u.)

    Mit php hab ich noch nicht soviel Erfahrung, die Darstellung wollt ich aber mit PHP machen. Bisher hab ich nur mit C++ und VB an DBs gearbeitet. Fragen zu PHP werden bestimmt noch kommen.

    @hp
    Leider ist mein Englisch vergleichbar mit meinem SQL:-[ , aber trotzdem Danke für den Link.
    Als Datenbank wollte ich mySQL benutzen.




    Zu Datenbankdesingn und SQL kann ich für den Einstieg auf jeden Fall auch diese Seite empfehlen http://ffm.junetz.de/members/reeg/DSP/node6.html



    Hab mir nun auch noch Gedanken gemacht und das ist meine derzeit richigste Lösung. Sind zwar ein paar Bytes mehr aber wahrscheinlich notwendig.


    Tabelle Messungen:
    - Timestamp (Primärschlüssel)
    - Messwert
    - Kalibrations-ID (sekundärschlüssel)

    Tabelle Kalibration
    - Timestamp
    - Faktor
    - Kalibrations-ID (Primärschlüssel)


    Hab das mit Access mal durchgetestet und folgende SQL-Abfrage liefert mir die gewünschte Liste (Ergebnis Faktor*Messung):


    Code:
    SELECT   [Messungen].[Timestamp], [Messungen].[Messwert]*[Kalibration].[Faktor] AS Analogwert
    FROM Messungen, Kalibration
    WHERE ((([Kalibration].[Kalibrations-ID])=[Messungen].[Kalibrations-ID]));