orausdo
Goto Top

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

Content-Key: 584532

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

Ausgedruckt am: 19.03.2024 um 03:03 Uhr

Mitglied: NordicMike
NordicMike 03.07.2020 um 13:53:27 Uhr
Goto Top
Du benötigst eine Key Spalte, die ab 1 durchzählt.
Du suchst nach Aktion 1 und merkst dir die Keynummer.
Dann liesst du die Spalte mit der Keynummer +1 aus und schaust ob es die gleiche Aktions-ID hat.
Mitglied: orausdo
orausdo 03.07.2020 um 14:07:07 Uhr
Goto Top
Hi Nordic Mike,

Danke für Deine Info.

Es gibt keine Key Spalte.
Aber wenn ich eine Key Spalte ala Row_Number o.ä. order by Uhrzeit baue,
dann habe ich zig verschiedene Aktionen dazwischen.
Oder wie soll ich diese erstellen, jeweils in Bezug zur ID bzw Vorgangsnummer?
Hast Du ein Beispiel?

Danke für weitere Infos.

Gruss
Mitglied: NordicMike
NordicMike 03.07.2020 aktualisiert um 14:38:17 Uhr
Goto Top
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.
Mitglied: orausdo
orausdo 03.07.2020 um 14:54:56 Uhr
Goto Top
Danke für Deine Info.

Die Tabelle hat keine Keys bzw. Schlüsselfelder.
Da werden ganz platt Rohdaten hineingeschrieben.
Insert ohne Key.
Bei manchen Daten fehlen Vorgangsnummern, die einem eindeutigen Vorgang mit mehreren Aktionen entsprechen.
Ich könnte nun nachträglich einen Key bauen.
Aber dieser fortlaufende Key mit Sortierung auf Vorgangs ID und Uhrzeit bringt mich nicht weiter,
da es immer wieder Aktionen gibt die nicht der gesuchten Reihenfolge entsprechen.
Hab überlegt mit einer Schleife + FETCH last FROM Cursor nach Aktion2 suche und mir mit der Schleife die entsprechende Aktion suche.

Hast Du Beispiel Statements zu Deiner Idee?

Dank für weitere Infos.
Mitglied: NordicMike
NordicMike 03.07.2020 um 15:57:45 Uhr
Goto Top
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.
Mitglied: orausdo
orausdo 03.07.2020 um 16:07:09 Uhr
Goto Top
Danke für die Infos.

Es geht nicht nur um neue Daten die reinkommen.
Die Daten die schon da sind (mom. ca .90 Mio Datensätze) müssen upgedatet werden, bzw. ein spezieller Wert in ein anderes Feld geschrieben werden.
Täglich kommen ca. 400 k neue Daten hinzu.

Werde mir Deinen Vorschlag mal genauer anschauen.

Danke für die Unterstützung.

Grüße
Mitglied: NordicMike
NordicMike 03.07.2020 um 16:10:05 Uhr
Goto Top
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.
Mitglied: orausdo
orausdo 03.07.2020 um 16:43:28 Uhr
Goto Top
Okay, ich schaue mal was geht....

Danke Dir.
Mitglied: MadMax
MadMax 03.07.2020 um 17:20:31 Uhr
Goto Top
Hallo O,

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
Mitglied: wiesi200
wiesi200 04.07.2020 um 11:22:01 Uhr
Goto Top
Hallo,
Du könntest ein sub select oder View machen einer Row Number Funktion, auf diese dann ein Select auf Aktion 1 und (RowNo aktion1 +1) und wenn das dann Aktion 2 ist hast du deine Antwort.
Mitglied: orausdo
orausdo 06.07.2020 um 08:22:28 Uhr
Goto Top
Danke Dir
Mitglied: orausdo
orausdo 06.07.2020 um 16:41:35 Uhr
Goto Top
Hi Mad Max,

Vielen Dank für Dein Statement.
Werde es testen.
Melde mich wieder.

Gruss O
Mitglied: orausdo
orausdo 10.07.2020 um 09:51:38 Uhr
Goto Top
Moin zusammen,

zur Info.

Ich konnte das Problem mit den LAG/LEAD Funktionen incl. Partition über AktionsNr lösen.

Ich danke allen Beteiligten für die Unterstützung.

Grüsse