Moin,
2 "ABER":
1. Ich glaube nicht, dass der unten genannte SQL von SQLite unterstützt wird, ich habs in einer "richtigen" Datenbank (PostgreSQL) ausprobiert.
2. Ohne DB-Redesign geht es meiner Meinung nach nicht.
Das Problem an der derzeitigen Struktur ist nämlich, dass Du mit SQL-Mitteln nicht rausfinden kannst, ob nicht zwischen 2 Werten > 60 Grad einer <= 60 Grad steckt, damit wäre eine Differenzmessung hinfällig.
Ich habe mal die Tabelle um eine ID (serial) erweitert, damit ich bei der Auswertung weiß, welche Meßwerte aufeinanderfolgen. So sieht dann die Tabelle mit gefüllten Werten aus:
Code:
id | temp | zeit
----+------+---------------------
1 | 53 | 2008-11-23 15:30:02
2 | 52 | 2008-11-23 15:30:43
3 | 61 | 2008-11-23 15:31:05
4 | 58 | 2008-11-23 15:31:36
5 | 63 | 2008-11-23 15:31:58
6 | 62 | 2008-11-23 15:32:18
7 | 64 | 2008-11-23 15:32:51
8 | 57 | 2008-11-23 15:33:14
9 | 63 | 2008-11-23 15:33:58
10 | 62 | 2008-11-23 15:34:18
11 | 57 | 2008-11-23 15:34:46
So der SQL:
Code:
select max(t2.zeit) - min(t1.zeit) as zeitraum, t1.zeit as startzeit
from temps as t1, temps as t2
where t1.id<t2.id
and t1.temp>60
and t2.temp>60
and t2.id+1=(select min(id) from temps where temp<61 and id>t1.id)
and t1.id-1=(select max(id) from temps where temp<61 and id<t1.id)
group by t1.zeit;
und so das Ergebnis:
Code:
zeitraum | startzeit
----------+---------------------
00:00:53 | 2008-11-23 15:31:58
00:00:20 | 2008-11-23 15:33:58
Ich habe hier also alle Zeiträume ausgespuckt, wo mindestens 2 Messwerte über 60 lagen. Ein 3. "ABER" gibts auch noch: das funktioniert nicht für den aktuellen Zeitraum, wenn der letzte Meßwert nicht < 61 war.
Jan
EDIT: Das 2. Aber nehme ich zurück, es geht auch ohne ID, allerdings verstärken sich dafür meine Zweifel, ob SQLite das packt ;-) So sollte es auch klappen:
Code:
select max(t2.zeit) - min(t1.zeit) as zeitraum, t1.zeit as startzeit
from temps as t1, temps as t2
where t1.zeit<t2.zeit
and t1.temp>60
and t2.temp>60
and t2.zeit<(select min(zeit) from temps where temp<61 and zeit>t1.zeit)
and t1.zeit=(select min(zeit) from temps where temp>60 and zeit<t2.zeit
and zeit>
(select max(zeit) from temps where temp<61 and zeit<t1.zeit))
group by t1.zeit;
Lesezeichen