![]() |
![]() |
|
![]() |
![]() |
|
Programmierung Rat & Tat für Programmierer |
![]() |
|
Themen-Optionen | Ansicht |
![]() |
#1 |
Master
![]() Registriert seit: 18.05.2000
Beiträge: 556
|
![]() 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 |
![]() |
![]() |
![]() |
#2 |
Master
![]() Registriert seit: 13.08.2003
Beiträge: 624
|
![]() 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. |
![]() |
![]() |
![]() |
#3 |
Master
![]() Registriert seit: 18.05.2000
Beiträge: 556
|
![]() 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 ... |
![]() |
![]() |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|