Die folgende T-SQL-Syntax kann verwendet werden, um zeitbezogen erfaßte Daten  zeitraumbasiert zu gruppieren und je Zeitraum den Anfangs- und Endwert und Minimum und Maximum zu ermitteln. Ausgang ist jeweils eine Tabelle mit drei Spalten: ID (Int, Identity), TIMESTAMP (datetime) und val (decimal).

 

SELECT
DO.ID
,START_TIME=DO.TIMESTAMP
,END_TIME=DC.TIMESTAMP
,OPEN_VAL=DO.VAL
,MIN_VAL=S2.MIN_VAL
,MAX_VAL=S2.MAX_VAL
,CLOSE_VAL=DC.VAL
FROM
DATA AS DO
INNER JOIN
(SELECT
MIN_ID=MIN(S1.ID)
,MAX_ID=MAX(S1.ID)
,MIN_VAL=MIN(S1.VAL)
,MAX_VAL=MAX(S1.VAL)
,S1.PART
FROM
(SELECT
ID
,[TIMESTAMP]
,VAL
,PART=60*(DATEDIFF(ss,'2016/01/01',[TIMESTAMP])/60)
FROM
DATA) AS S1
GROUP BY S1.PART) AS S2 ON DO.ID=S2.MIN_ID
INNER JOIN DATA AS DC ON S2.MAX_ID=DC.ID

 Erläuterung:

Zunächst werden die Datenaggregate über das partitionierte DateTime-Feld erzeugt und die Verknüpfungs-IDs für den jeweils ersten und letzten Tupel in zeitlicher Reihenfolge erzeugt. Über die Verknüpfungs-IDs werden dann die jeweils ersten und letzten Tupel verbunden. Der Wert "60" steht hier für 60 Sekunden (Datediff(ss...). Sowohl der Datepart-Bezeichner, als auch der Absolutwert können hier geändert werden, um das Darstellungsintervall zu variieren.

Kategorie: SQL
Zugriffe: 646