Abfrage von Datensätze von bestimmtem Zeitraum plus nächst-früherer
Hallo Zusammen,
ich habe eine Datenbank-Tabelle in die (sagen wir mal) ein Werte von einer Messstelle geschrieben wird.
Die Tabelle "messwerte" hat die folgenden Spalten:
Die Werte werden allerdings nicht in gleichen Zeitabständen in die Tabelle geschrieben.
Lediglich wenn sich der Wert geändert hat, wird der neue Wert mit aktuellem Datum und Uhrzeit in die Tabelle geschrieben.
Beispiel:
Nehmen wir an, ich will die Werte von 02.01.2018 00:00 bis 02.01.2018 01:00.
Mit der entsprechenden Abfrage
erhalte ich schließlich lediglich die Zeilen mit den IDs 2, 3, 4 & 5.
Um keine Lücke von 2018-01-02 00:00 bis 2018-01-02 00:10 zu haben, benötige ich schließlich noch die Zeile mit der ID 1.
In welchem Abstand diese zusätzlich benötigte Zeile zum eigentlich betrachteten Zeitraum liegt ist natürlich beliebig willkürlich.
Dass man durch eine Verschachtelung von Abfragen die Daten erhalten kann, ist mir bewusst. Da die Tabelle in der Realität aber die Werte mehrere Messstellen (zu sehen an der Spalte "messstellen_ID", Foreign Key auf die Tabelle "messstellen") beinhalten wird, stellt sich mir die Frage, ob es eine schlanke elegante Lösung für mein Vorhaben gibt.
Falls nicht kann ich mir die folgenden Alternativen vorstellen:
Danke schon mal für eure Hilfe
Gruß
mabue
ich habe eine Datenbank-Tabelle in die (sagen wir mal) ein Werte von einer Messstelle geschrieben wird.
Die Tabelle "messwerte" hat die folgenden Spalten:
ID INT
Zeitpunkt DATETIME
Wert INT
Die Werte werden allerdings nicht in gleichen Zeitabständen in die Tabelle geschrieben.
Lediglich wenn sich der Wert geändert hat, wird der neue Wert mit aktuellem Datum und Uhrzeit in die Tabelle geschrieben.
Beispiel:
ID messstellen_ID Zeitpunkt Wert
=================================================
1 1 2018-01-01 23:59:00 0
2 1 2018-01-02 00:10:00 1
3 1 2018-01-02 00:20:00 2
4 1 2018-01-02 00:45:00 3
5 1 2018-01-02 00:59:00 4
6 1 2018-01-02 01:10:00 5
Nehmen wir an, ich will die Werte von 02.01.2018 00:00 bis 02.01.2018 01:00.
Mit der entsprechenden Abfrage
SELECT * FROM messwerte WHERE Zeitpunkt >= "2018-01-02 00:00:00" AND Zeitpunkt < "2018-01-02 01:00:00";
Um keine Lücke von 2018-01-02 00:00 bis 2018-01-02 00:10 zu haben, benötige ich schließlich noch die Zeile mit der ID 1.
In welchem Abstand diese zusätzlich benötigte Zeile zum eigentlich betrachteten Zeitraum liegt ist natürlich beliebig willkürlich.
Dass man durch eine Verschachtelung von Abfragen die Daten erhalten kann, ist mir bewusst. Da die Tabelle in der Realität aber die Werte mehrere Messstellen (zu sehen an der Spalte "messstellen_ID", Foreign Key auf die Tabelle "messstellen") beinhalten wird, stellt sich mir die Frage, ob es eine schlanke elegante Lösung für mein Vorhaben gibt.
Falls nicht kann ich mir die folgenden Alternativen vorstellen:
- Zunächst durch eine Abfrage die Daten des betrachteten Zeitraums abfragen und anschließend die "Lücken" zu Beginn durch entsprechend zusätzliche ermitteln
- Beim Erstellen eines neuen Datensatzes entweder die ID des vorigen Datensatzes oder gleich die Daten des vorigen Datensatzes mit speichern.
Danke schon mal für eure Hilfe
Gruß
mabue
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 377587
Url: https://administrator.de/contentid/377587
Ausgedruckt am: 24.11.2024 um 14:11 Uhr
6 Kommentare
Neuester Kommentar
Hi,
rein zur Logik:
Ich sehe nicht, wo Du hier "eine Lücke" hast.
Falls es darauf ankommen sollte, den Fragen von Penibelchen zuvorzukommen, könntest Du die Spalte "Zeitpunkt" einfach als "Zeitpunkt >= 2018-01-02 00:00:00" nennen.
Wenn dann noch Fragen kommen, dann weiß ich nicht.
E.
rein zur Logik:
Ich sehe nicht, wo Du hier "eine Lücke" hast.
Falls es darauf ankommen sollte, den Fragen von Penibelchen zuvorzukommen, könntest Du die Spalte "Zeitpunkt" einfach als "Zeitpunkt >= 2018-01-02 00:00:00" nennen.
SELECT [ID], [messstellen_ID], [Zeitpunkt] AS [Zeitpunkt größer 2018-01-01 23:59:59], [Wert]
FROM [messwerte]
WHERE [Zeitpunkt] >= "2018-01-02 00:00:00" AND [Zeitpunkt] < "2018-01-02 01:00:00";
Wenn dann noch Fragen kommen, dann weiß ich nicht.
E.
OK, das Diagramm hast Du nicht erwähnt.
Kannst Du Dich darauf verlassen, dass die ID's fortlaufend sind? Falls ja, dann könntest Du als erstes die ID's von ersten und letzten Datensatz der Ergebnisse des gesuchten Zeitfensters erfassen und danach die Suche erneut ausführen, jetzt aber nach ID mit Filter: von "ID jüngster Satz minus 1" bis "ID ältester Satz plus 1".
Kannst Du Dich darauf verlassen, dass die ID's fortlaufend sind? Falls ja, dann könntest Du als erstes die ID's von ersten und letzten Datensatz der Ergebnisse des gesuchten Zeitfensters erfassen und danach die Suche erneut ausführen, jetzt aber nach ID mit Filter: von "ID jüngster Satz minus 1" bis "ID ältester Satz plus 1".
Ich weiß ja jetzt nicht, welches Programm diese Abfragen macht. Programmierst Du da selbst am FrontEnd oder in er Auswertung oder sollst Du da "bloß" die Sichten im SQL vorbereiten?
Andere Frage: Warum brauchst Du im Diagramm einen Anfangswert vor dem Anfangswert? Der erste gelieferte Wert wird angezeigt und fertig. Du kannst ja eh bloß Werte anzeigen, welche in der DB sind. Wenn diese auch nur zeitgesteuert geliefert werden, dann können die Werte dazwischen auch schwanken, ohne dass man das hinterher mit Daten belegen kann.
Für mich sieht die Denkweise falsch aus. Wenn ich Werte zwischen "2018-01-02 00:00:00" und "2018-01-02 01:00:00" wissen will, aber auch, "woher" der erste gelieferte Wert kommt, also abfallend oder steigend (Trend) - ist dann nicht schon meine Abfrage falsch? Ich meine, schon im Kopf? Dann muss ich eben einen größeren Zeitraum abfragen und von diesem einen kleineren Ausschnitt anzeigen. Also eine nachfolgende Logik nach der Abfrage. Einem SQL-Server tut es nicht weh, wenn Du bei der Abfrage das Zeitfenster auf Verdacht streckst. Wenn dadurch nicht gerade tausende oder millionen Datensätze mehr geliefert werden, dann kann man doch bei der Abfrage am Startdatum "minus ein Tag" o.ä. arbeiten. Diese paar Bytes jucken den SQL-Server nicht. Oder?
Andere Frage: Warum brauchst Du im Diagramm einen Anfangswert vor dem Anfangswert? Der erste gelieferte Wert wird angezeigt und fertig. Du kannst ja eh bloß Werte anzeigen, welche in der DB sind. Wenn diese auch nur zeitgesteuert geliefert werden, dann können die Werte dazwischen auch schwanken, ohne dass man das hinterher mit Daten belegen kann.
Für mich sieht die Denkweise falsch aus. Wenn ich Werte zwischen "2018-01-02 00:00:00" und "2018-01-02 01:00:00" wissen will, aber auch, "woher" der erste gelieferte Wert kommt, also abfallend oder steigend (Trend) - ist dann nicht schon meine Abfrage falsch? Ich meine, schon im Kopf? Dann muss ich eben einen größeren Zeitraum abfragen und von diesem einen kleineren Ausschnitt anzeigen. Also eine nachfolgende Logik nach der Abfrage. Einem SQL-Server tut es nicht weh, wenn Du bei der Abfrage das Zeitfenster auf Verdacht streckst. Wenn dadurch nicht gerade tausende oder millionen Datensätze mehr geliefert werden, dann kann man doch bei der Abfrage am Startdatum "minus ein Tag" o.ä. arbeiten. Diese paar Bytes jucken den SQL-Server nicht. Oder?
Moin,
mal folgenden Ansatz, wobei ich davon ausgehe, dass deine Intervalle über ein Eingabefeld in eine Variable fließen, daziwschen aber noch validiert werden (Stichwort SQLInjection).
Dein darzustellendes Intervall wäre folgendes:
Also:
varVON = "2018-01-02 00:00:00"
varBIS = "2018-01-02 01:00:00"
Jetzt willst du ja zusätzlich wissen, welches der nächst jüngste am "2018-01-02 00:00:00" (varVON) ist, richtig?
Dann brauchst du also eine Zweite Abfrage:
Am Ende beide Statements wie UNION ALL zusammenfügen:
So müsste es klappen, denke ich (ungetestet).
kleinere Syntaxfehler solltest du ja selbst ausgebügelt bekommen, aber ich denke, die Logik geht hervor.
Gruß
em-pie
mal folgenden Ansatz, wobei ich davon ausgehe, dass deine Intervalle über ein Eingabefeld in eine Variable fließen, daziwschen aber noch validiert werden (Stichwort SQLInjection).
Dein darzustellendes Intervall wäre folgendes:
... where [Zeitpunkt] >= "2018-01-02 00:00:00" AND [Zeitpunkt] < "2018-01-02 01:00:00";
varVON = "2018-01-02 00:00:00"
varBIS = "2018-01-02 01:00:00"
Jetzt willst du ja zusätzlich wissen, welches der nächst jüngste am "2018-01-02 00:00:00" (varVON) ist, richtig?
Dann brauchst du also eine Zweite Abfrage:
SELECT TOP 1 id, messstellen_id, Zeitpunkt, Wert
FROM messwerte
WHERE [Zeitpunkt] <= varVON;
ORDER BY [Zeitpunkt] desc
Am Ende beide Statements wie UNION ALL zusammenfügen:
(SELECT TOP 1 id, messstellen_id, Zeitpunkt, Wert
FROM messwerte
WHERE [Zeitpunkt] <= varVON;
ORDER BY [Zeitpunkt] desc)
UNION ALL
(SELECT TOP 1 id, messstellen_id, Zeitpunkt, Wert
FROM messwerte
WHERE [Zeitpunkt] >= varVON AND [Zeitpunkt] < varBIS
ORDER BY [ZEITPUNKT]);
So müsste es klappen, denke ich (ungetestet).
kleinere Syntaxfehler solltest du ja selbst ausgebügelt bekommen, aber ich denke, die Logik geht hervor.
Gruß
em-pie