mabue88
Goto Top

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:
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";  
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:
  • 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

Content-ID: 377587

Url: https://administrator.de/contentid/377587

Ausgedruckt am: 24.11.2024 um 14:11 Uhr

emeriks
emeriks 20.06.2018 aktualisiert um 13:06:13 Uhr
Goto Top
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.
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.
mabue88
mabue88 20.06.2018 um 15:28:09 Uhr
Goto Top
Hallo emeriks,

da geht es nicht um "Penibelchen".

Lass mich mal die Daten, die in der Tabelle vorliegen, etwas offensichtlicher definieren...
ID   messstellen_ID   Zeitpunkt              Wert
=================================================
1    1                2018-01-01 23:59:00    0
2    1                2018-01-02 00:45:00    1
3    1                2018-01-02 01:10:00    5

Gleiche Abfrage mit diesem geänderten Inhalt der Tabelle.
Sprich: gib mir die Werte von 2018-01-02 00:00:00 bis 2018-01-02 01:00:00
Das Ergebnis wird sein:
ID   messstellen_ID   Zeitpunkt              Wert
=================================================
2    1                2018-01-02 00:45:00    1

Wenn ich innerhalb eines Diagrammes (z.B. Liniendiagramm, x-Achse ist die Zeit mit dem abgefragten Zeitraum) die Werte nun graphisch darstellen will, habe ich in diesem Szenario lediglich den Messwerte von 00:45:00 Uhr.
Um in dem Diagramm für die Zeit von 00:00:00 Uhr bis 00:45:00 Uhr etwas anzeigen zu können, benötige ich den letzten Wert, der Messstelle, die in der Tabelle vorliegt...

Und genau das ist meine Frage... Wie bekomme ich den vernünftig abgefragt?

Ich hoffe mich damit klarer ausgedrückt zu haben. face-smile

Danke & Gruß
emeriks
emeriks 20.06.2018 um 15:35:19 Uhr
Goto Top
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".
mabue88
mabue88 20.06.2018 um 16:58:00 Uhr
Goto Top
Solange ich nur die Werte einer Messgröße in der Tabelle habe, sind die IDs tatsächlich fortlaufend.
Sobald aber auch Werte von einer weiteren Messgröße darin abgelegt werden (und das ist sehr wahrscheinlich), sind die IDs nicht mehr zwangsläufig fortlaufend.

Das mit der verschachtelten Abfrage habe ich mir auch schon gedacht. Allerdings mit dem Nachteil, dass die Anzahl der verschachtelten Abfragen linear mit der Anzahl der Messgrößen steigt (oder sehe ich da was falsch).
emeriks
emeriks 20.06.2018 um 17:12:06 Uhr
Goto Top
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?
em-pie
em-pie 20.06.2018 um 18:33:47 Uhr
Goto Top
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:
... where [Zeitpunkt] >= "2018-01-02 00:00:00" AND [Zeitpunkt] < "2018-01-02 01:00:00";  
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:
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