WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Datenbankabfrage, SQLite (http://www.wcm.at/forum/showthread.php?t=225553)

MasterX 14.12.2007 19:54

Datenbankabfrage, SQLite
 
Hallo !

Es geht um die Abfrage aus einer Datenbank. (Verwendet wir eine SQLite Datenbank, hab also wahrscheinlich nur die Standard-SQL Befehle zur Verfügung)

Relevant sind hierbei prinzipiell zwei Tabellen (wobei ich jetzt nicht alle Felder darstelle):

Tabelle1:
+--------------+----------+-------+--------+
| DatensatzNr | DeviceID | Datum | Faktor |
+--------------+----------+-------+--------+
| 1 | 1 | | 1 |
| 2 | 1 | | 1 |

Tabelle2:
+-------------+-----------+-------+
| DatensatzNr | Timestamp | Value |
+-------------+-----------+-------+
| 1 | 123 | 2 |
| 1 | 124 | 3 |
| 1 | 125 | 4 |
| 1 | 126 | 5 |
| 2 | 123 | 2 |
| 2 | 124 | 3 |
| 2 | 125 | 4 |
| 2 | 126 | 6 | <- "falscher Wert" != 5


Konkret gehts darum: Aus einem Gerät wird in gewissen Abständen ein Datensatz ausgelesen. Dieser ist nach dem FIFO Prinzip organsiert, d.h. es fällt beim Speichern eines neuen Wertes der älteste hinaus.
In der Datenbank wird immer der komplette Datensatz gespeichert, in Tabelle1 bekommt dieser eine eindeutige Nummer (DatensatzNr, ist PRIMARY KEY). (Datum ist der Zeitpunkt zu dem er ausgelesen wurde). In Tabelle2 werden dann die eigentlichen Werte des Datensatzes eingetragen.

Da jetzt immer komplette Datensätze und nicht nur die neuen Werte gespeichert werden, sind die Werte bzw. Timestamps dann mehrfach vorhanden. Z.B. Timestamp 123 kommt in DatensatzNr 1 und 2 vor (und hat bei beiden den Wert 2, so wie es sein soll).
Wenn alles stimmt, bekomm ich dann über ein DISTINCT beim Timestamp eine schöne Tabelle mit meinen kompletten Daten.

Allerdings kann jetzt theoretisch auch der (Fehler)Fall eintreten, dass bei gleichen Timestamps unterschiedliche Werte stehen. Und genau hier komm ich im Moment mit meinem, in den letzten zwei Tagen wieder hervorgekramten, SQL-Wissen nicht weiter.
Konkret will ich feststellen, ob alle Timestamps gleiche Werte haben. Wenn nicht, will ich feststellen können welcher Timestamp schuld ist und die Abweichung dann dem Benutzer anzeigen (das ganze läuft über ein selbst programmiertes Frontend). Wie kann ich das SAUBER lösen (d.h. so viel wie möglich direkt in SQL und nicht im Programm) ?

Hoffe ich konnte mein Anliegen halbwegs verständlich formulieren ;)

besten Dank schon mal !
MasterX

T.dot 14.12.2007 22:06

In Mysql würd ichs ca. so machen:

SELECT * FROM tabelle2
WHERE timestamp IN (
SELECT timestamp
FROM tabelle2
GROUP BY timestamp
HAVING count( DISTINCT value ) >1
)


Hiermit holst du dir alle Datensätze, die zu einem Timestamp unterschiedliche Werte haben:
SELECT timestamp FROM tabelle2
GROUP BY timestamp
HAVING count( DISTINCT value ) >1


Mit den SELECT * FROM tabelle2 WHERE timestamp IN ( ... ) werden dann alle Daten der zugehörigen Datensätze ausgelesen.

MasterX 14.12.2007 23:14

Besten Dank !! Macht genau das was ich will.

Auf das "HAVING COUNT (DISTINCT..." wär ich selber so schnell nicht gekommen, obwohl mir diese Kommandos an sich bekannt sind ...


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag