Ich habe eine Tabelle UMS_KKU mit 4 spalten Terminalnr-NUMBER,Jdate-DATE,Jtime-VARCHAR2(10),Kartennr-VARCHAR2(30). Ich möchte alle Terminalnummern rausfiltern die eine karte doppelt verwendet haben oder zeit abstand von unter 5 min. gleiche kartennummer. Ich bin Oracle Noob und ich habe keine Ahnung was ich machen soll.
Hallo Gagi!
Als erstes fällt mir mal auf: Die Spalte JTime speichert wohl die Transaktions(?)zeit, die zu JDate gehört. Das sit aber nicht notwendig, Oracle kann in einem DATE Feld auch die Zeit speichern. Damit ersparst du dir im folgenden Select schon mal die Datumsgrenzenprüfung. Mit der geänderten Tabelle ginge das dann so:
SELECT TerminalNr FROM MyTab main WHERE EXISTS (SELECT 1 FROM MyTab Sub WHERE Sub.TerminalNr=Main.TerminalNr AND Sub.KartenNr=Main.KartenNr AND Sub.JDate Main.JDate-(300/86400));
Die Zeitgrenzenprüfung im Subselect prüft absichtlich nur Sätze, die älter sind als der aktuelle Satz des Main-Selects, weil du ja sonst für Satz A und B, die die Kriterien erfüllen zuerst bei Satz A den Satz B im Subselect findest und danach noch umgekehrt bei Satz B den Satz A im Subselect findest. Brauchst du allerdings auch die beiden Zeiten, dann müsstest du die Grenzen auf ± 5 Minuten erweitern (nicht vergessen den eigenen Zeitstempel auszuschlissen, sonst bekommst du alle Terminals!).
Wenn du die Spalten nicht zusammenfasst brauchst du eine relativ komplexe Prüfung des Zeitbereichs, weil du ja dann z.B. zwei Transaktionen um 23:59 und 00:01 auch noch prüfen müsstest.
Gruß
Martin
P.S.: Ich hab’ den SELECT nicht ausprobiert, Fehler musst du also selbst ausbessern, das Prinzip sollte aber klar sein, denke ich.
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Danke, Danke, Danke das hat super funktioniert.
Gruß
Gagi