Lösung für speziellen Select

Steven85

Benutzer
Beiträge
12
Ich habe folgende Tabellenstruktur für eine DB zur Speicherung von Heizdaten:

ID ___Datum__________VentilStellung
1_____01.03.2014 06:20__25
2_____01.03.2014 06:21__25
3_____01.03.2014 06:22__25
4_____01.03.2014 06:23__0
5_____01.03.2014 06:24__0
6_____01.03.2014 06:25__10
7 _____01.03.2014 06:26__10
8_____01.03.2014 06:27__0
...

Die Ventilstellung stellt in % dar wie weit ein Ventil eines Heizkörpers geöffnet ist.
Jetzt will ich aus dieser Tabelle folgendes Ergebnis erzeugen.
Ausgegangen wird in diesem Beispiel von nur einem Thermostat.

Von____________Bis
01.03.2014 06:20 __01.03.2014 06:22
01.03.2014 06:25 __01.03.2014 06:26
...

Ich möchte also Quasi die Perioden Filtern in denen das Ventil geöffnet war.
 
Werbung:
Ich habe folgende Tabellenstruktur für eine DB zur Speicherung von Heizdaten:

Ich möchte also Quasi die Perioden Filtern in denen das Ventil geöffnet war.

Ich vereinfache mal: für die Zeiten nehme ich Integer, weniger zum tippen, Ansonsten ist das egal.

Also, Du hast:

Code:
test=*# select * from heizung ;
 von | bis | val
-----+-----+-----
  1 |  2 |  25
  2 |  3 |  25
  3 |  4 |  25
  4 |  5 |  0
  5 |  6 |  0
  6 |  7 |  0
  7 |  8 |  10
  8 |  9 |  10
  9 |  10 |  10
(9 rows)

Und suchst:

Code:
test=*# select distinct val, min(von) over (partition by val order by von rows between unbounded preceding and current row), max(bis) over (partition by val order by bis rows between current row and unbounded following ) from heizung order by min;
 val | min | max
-----+-----+-----
  25 |  1 |  4
  0 |  4 |  7
  10 |  7 |  10
(3 rows)

min / max sind die Start- und Endzeiten. Solche Window-Funktionen kann, soweit ich weiß, auch M$SQL, ich verwende PostgreSQL.
 
select distinct
min(Datum) over (partition by VentilStellung order by Datum rows between unbounded preceding and current row),
max(Datum) over (partition by VentilStellung order by Datum rows between current row and unbounded following)
from Heizung order by Datum;

So sollte es korrekt sein, jedoch sagt er das in der nähe vom ersten "rows" ein Syntaxfehler wäre.
Alle Schlüsselwörter werden aufjedenfall von MSSQL erkannt.
 
Definitiv nicht!

select distinct
min(Datum) over (partition by VentilStellung order by Datum rows between unbounded preceding and current row),
max(Datum) over (partition by VentilStellung order by Datum rows between current row and unbounded following)
from Heizung order by Datum;

Hier sagt er mir wie oben erwähnt einen Syntax Fehler in der Nähe von rows.
Entferne ich den jeweils hinteren Teil und höre bei order by auf, also so...

select distinct
min(Datum) over (partition by VentilStellung order by Datum),
max(Datum) over (partition by VentilStellung order by Datum)
from Heizung order by Datum;

... liegt angeblich ein Syntax Fehler in der nähe von order.
Ich weiß absolut nicht mehr weiter.
 
Die Syntax scheint nur unter SQL 2012 funktionsfähig, SQL 2008 R2 und früher haben wesentlich weniger Funktionen. Über welche Version reden wir hier?
 
Dann wird es wohl daran liegen, habe bei mir 2008 R2 am laufen.
Gelöst habe ich das Problem jetzt so, dass ich alle Daten eines Thermostats abrufe und mit C# das ganze auswerte.
 
Werbung:
Gut, mit dem eigentlichen Problem habe ich mich noch gar nicht auseinander gesetzt. Bin die letzten 2 Wochen ausgefallen und die nächsten Wochen auch nicht so aktiv aber irgendwie findet man eigentlich immer eine Lösung. Im Falle der Syntax wird diese tatsächlich erst ab 2012 und nicht unter 2008 R2 unterstützt, daher der etwas merkwürdige Fehler zumal dein SQL Management Studio eventuell auch schon neuer ist nur eben dein Server nicht.
 
Zurück
Oben