Abfrage Problem
Hallo zusammen,
ich habe folgendes Problem und ich hoffe ihr könnt mir helfen.
DB System MS SQL Server
Ich habe folgende Tabelleninhalte:
Datum, Uhrzeit, Maßnahme
01.01.2020 12:00 Aktion 1
01.01.2020 12:05 Aktion 2
Dazwischen kann es n andere Aktionen geben.
Es gibt in der Tabelle eindeutige ID's welche die diversen Aktionen beinhalten.
Ich muss folgende Konstellation herausfinden.
Immer wenn Aktion2 auf Aktion1 direkt folgt, also der absolut nächste Datensatz ist, dann muss ich in eine weitere Spalte eine andere Aktion.-Nr schreiben.
Aber nur wenn sich zwischen den beiden Aktionen keine andere befindet und Aktion2 der Aktion1 zeitlich folgt.
Wie könnte ich das am Besten bewerkstelligen.
Vielen Dank für eine Rückinfo.
Grüße O
ich habe folgendes Problem und ich hoffe ihr könnt mir helfen.
DB System MS SQL Server
Ich habe folgende Tabelleninhalte:
Datum, Uhrzeit, Maßnahme
01.01.2020 12:00 Aktion 1
01.01.2020 12:05 Aktion 2
Dazwischen kann es n andere Aktionen geben.
Es gibt in der Tabelle eindeutige ID's welche die diversen Aktionen beinhalten.
Ich muss folgende Konstellation herausfinden.
Immer wenn Aktion2 auf Aktion1 direkt folgt, also der absolut nächste Datensatz ist, dann muss ich in eine weitere Spalte eine andere Aktion.-Nr schreiben.
Aber nur wenn sich zwischen den beiden Aktionen keine andere befindet und Aktion2 der Aktion1 zeitlich folgt.
Wie könnte ich das am Besten bewerkstelligen.
Vielen Dank für eine Rückinfo.
Grüße O
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 584532
Url: https://administrator.de/forum/abfrage-problem-584532.html
Ausgedruckt am: 22.12.2024 um 16:12 Uhr
13 Kommentare
Neuester Kommentar
Die Key Spalte hat eine ähnliche Funktion wie Order by Uhrzeit, nur kannst du für die Abfrage die Uhrzeit nicht ordentlich vergleichen, ob noch Zeiten dazwischen existieren. Bei einer laufenden Nummer brauchst du nur +1 machen.
Die Key Spalte ist eine vorhandene Spalte, die als Key verwendet wird, also eine eindeutige ID, die nicht doppelt vorkommen kann. Das kann ein Benutzername, ein Datum oder eine laufende Nummer sein. am einfachsten machst du dir eine laufende Nummer. Diesen Key kann man auf autoincremented stellen, sodass du sie beim hinzufügen von Zeilen gar keine Nummer mehr eintragen musst und annst.
Füge diese spalte mit einem SQL Befehl hinzu und deklariere sie als Key. Im Moment müsste irgend etwas anderes ein Key haben, das sieht man in der Tabelle ganz oben bei den Spaltennamen - ein kleines Schlüsselsymbol.
Die Key Spalte ist eine vorhandene Spalte, die als Key verwendet wird, also eine eindeutige ID, die nicht doppelt vorkommen kann. Das kann ein Benutzername, ein Datum oder eine laufende Nummer sein. am einfachsten machst du dir eine laufende Nummer. Diesen Key kann man auf autoincremented stellen, sodass du sie beim hinzufügen von Zeilen gar keine Nummer mehr eintragen musst und annst.
Füge diese spalte mit einem SQL Befehl hinzu und deklariere sie als Key. Im Moment müsste irgend etwas anderes ein Key haben, das sieht man in der Tabelle ganz oben bei den Spaltennamen - ein kleines Schlüsselsymbol.
Du wirst von mir keinen Code vorgekaut bekommen, weil ich keine Lust habe zu überprüfen ob die Syntax stimmt.
Du musst nicht alles komplett durchsuchen, sondern erst, wenn du was neues rein schreibst.
1) Lege die Spalte an, Inhalt mit Integer, als autoincrement.
2) Lege dir einen Trigger an, der auslöst, nachdem du eine neue Zeile in die Tabelle geschrieben hast.
3) Der trigger kennt die aktuellen Variablen, auch den Key-Wert.
4) Dann überprüfst du dort, wo die Zeile den Key-Wert -1 hat, ob die Aktions-ID die gleiche ist wie Daten aktuell in den Variablen. Wenn ja, oder wenn nicht, kannst du jeweils unterschiedliche weitere Manipulationen vornehmen.
Jetzt, wo ich mir den Vorgang anschaue, fällt mir ein, dass es der Trigger auch ohne Key ganz einfach kann:
Du kannst auch einen Trigger vor dem Befüllen der Zeile auslösen, dann ein neues SELECT machen, nach Datum sortieret, Menge 1, und die jüngste Spalte überprüft, ob die Aktions-ID die gleiche ist, wie die, die du eben beschreiben willst.
Du musst nicht alles komplett durchsuchen, sondern erst, wenn du was neues rein schreibst.
1) Lege die Spalte an, Inhalt mit Integer, als autoincrement.
2) Lege dir einen Trigger an, der auslöst, nachdem du eine neue Zeile in die Tabelle geschrieben hast.
3) Der trigger kennt die aktuellen Variablen, auch den Key-Wert.
4) Dann überprüfst du dort, wo die Zeile den Key-Wert -1 hat, ob die Aktions-ID die gleiche ist wie Daten aktuell in den Variablen. Wenn ja, oder wenn nicht, kannst du jeweils unterschiedliche weitere Manipulationen vornehmen.
Jetzt, wo ich mir den Vorgang anschaue, fällt mir ein, dass es der Trigger auch ohne Key ganz einfach kann:
Du kannst auch einen Trigger vor dem Befüllen der Zeile auslösen, dann ein neues SELECT machen, nach Datum sortieret, Menge 1, und die jüngste Spalte überprüft, ob die Aktions-ID die gleiche ist, wie die, die du eben beschreiben willst.
Du musst dann zwischen denen, die nachträger geprüft werden und denen, die neu dazu kommen separat behandeln. Wenn neue kommen, müssen sie nicht mehr alle 90 Millionen durchtesten. Wenn du die 90 Millionen getestet hast, sind wieder welche dazu gekommen.
Mach also das eine mit dem Trigger und das andere als separates Prüfprogramm.
Mach also das eine mit dem Trigger und das andere als separates Prüfprogramm.
Hallo O,
probier mal:
Wobei Du natürlich ein Problem hast ohne IDs. Wenn es mehrere Datensätze mit der gleichen Uhrzeit gibt, welches ist dann der nächste? Dann kann der nächste Datensatz mit Aktion 2 auch dieselbe Uhrzeit haben wie der mit der Aktion 1. Woher weiß ich dann, ob nicht zuerst Aktion 2 und dann erst Aktion 1 war?
Ich hoffe jedenfalls mal, Du hast wenigstens Sekunden oder besser noch Millisekunden bei Deiner Zeit. Oben in Deinem Beispiel stehen ja nur Minuten, da hättest Du wahrscheinlich ein sehr großes Problem.
Gruß, Mad Max
probier mal:
update Tabelle
set NeueSpalte = Aktion3
from Tabelle t
where Massnahme = Aktion1 and
(select top (1) Massnahme from Tabelle where DatumZeit > t.DatumZeit order by DatumZeit) = Aktion2
Wobei Du natürlich ein Problem hast ohne IDs. Wenn es mehrere Datensätze mit der gleichen Uhrzeit gibt, welches ist dann der nächste? Dann kann der nächste Datensatz mit Aktion 2 auch dieselbe Uhrzeit haben wie der mit der Aktion 1. Woher weiß ich dann, ob nicht zuerst Aktion 2 und dann erst Aktion 1 war?
Ich hoffe jedenfalls mal, Du hast wenigstens Sekunden oder besser noch Millisekunden bei Deiner Zeit. Oben in Deinem Beispiel stehen ja nur Minuten, da hättest Du wahrscheinlich ein sehr großes Problem.
Gruß, Mad Max