Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Lösung für speziellen Select

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Steven85, 13 März 2014.

  1. Steven85

    Steven85 Benutzer

    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.
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. Steven85

    Steven85 Benutzer

    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.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Mmh. Kann sein, daß die Syntax etwas anders ist, vielleicht weiß @ukulele mehr.
     
  5. Steven85

    Steven85 Benutzer

    Keiner mehr eine Idee wo das Problem liegen könnte?
     
  6. akretschmer

    akretschmer Datenbank-Guru

  7. Steven85

    Steven85 Benutzer

    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.
     
  8. ukulele

    ukulele Datenbank-Guru

    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?
     
  9. Steven85

    Steven85 Benutzer

    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.
     
  10. ukulele

    ukulele Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden