Selektion in Abh. des zuletzt gefundenen Datensatzes

Hallo,

ich möchte aus einer Tabelle Einträge in Abhängigkeit der bereits selektierten Daten wählen.

Beispielhaft folgende Einträge in einer Tabelle:

ID ;TIMESTMP
1 ;13.02.2008 23:51:03
2 ;13.02.2008 23:57:23
3 ;13.02.2008 23:58:52
4 ;14.02.2008 00:01:16
5 ;14.02.2008 00:01:41
6 ;14.02.2008 00:03:37
7 ;14.02.2008 00:06:22
8 ;14.02.2008 00:09:12
9 ;14.02.2008 00:17:54
10 ;14.02.2008 00:18:44

Angenommen die Selektion erfolgt am 14.02.:
Gesucht werden soll zunächst der erste Eintrag für den aktuellen Tag, also ID 4. Ausgehend davon soll geprüft werden, ob es Daten gibt, die einen Zeitstempel < dem Zeitstempel von ID 4 haben. Es sollen aber nur so lange Daten gewählt werden, bis die “Lücke” zw. zwei Zeitstempeln größer 5min ist (also ID 3 und 2). Gleiches soll für alle Datensätze mit einem Zeitstempel > dem Zeitstempel von ID 4 geschehen, ebenfalls bis die “Lücke” größer 5min wird (also 5, 6, 7, 8).

Ergebnis für obiges Beispiel soll also sein:
ID ;TIMESTMP
2 ;13.02.2008 23:57:23
3 ;13.02.2008 23:58:52
4 ;14.02.2008 00:01:16
5 ;14.02.2008 00:01:41
6 ;14.02.2008 00:03:37
7 ;14.02.2008 00:06:22
8 ;14.02.2008 00:09:12

Idealerweise sollte das Statement sowohl auf Oracle als auch auf DB2 laufen. Wer kann mir bei diesem Problem helfen?
Danke!

  1. Dein Beispiel paßt nicht zur Aufgabe. Beginnend von ID 4 liegen die Datensätze 7 und 8 mehr als 5 Minuten weg.
  2. Hier ist weder Oracle noch DB2
test=*# select * from firegirl ;
 id |         ts
----+---------------------
  1 | 13.02.2008 23:51:03
  2 | 13.02.2008 23:57:23
  3 | 13.02.2008 23:58:52
  4 | 14.02.2008 00:01:16
  5 | 14.02.2008 00:01:41
  6 | 14.02.2008 00:03:37
  7 | 14.02.2008 00:06:22
  8 | 14.02.2008 00:09:12
  9 | 14.02.2008 00:17:54
 10 | 14.02.2008 00:18:44
(10 rows)

test=*# select * from firegirl where ts between (select min(ts)-'5min'::interval from firegirl where ts::date = '14.02.2008'::date) and (select min(ts)+'5min'::interval from firegirl where ts::date = '14.02.2008'::date);
 id |         ts
----+---------------------
  2 | 13.02.2008 23:57:23
  3 | 13.02.2008 23:58:52
  4 | 14.02.2008 00:01:16
  5 | 14.02.2008 00:01:41
  6 | 14.02.2008 00:03:37
(5 rows)

Andreas

Hallo Andreas,

vielen Dank für Deine Antwort.
Ich versuche die Anforderung noch einmal etwas anders zu formulieren (für Datensätze, die >= ID 4 gefunden werden sollen):
Ausgehend von ID 4 wird geschaut, ob es einen Datensatz gibt, der einen größeren Zeitstempel hat, aber nicht weiter als 5min von ID 4 entfernt ist. Gefunden wird ID 5. Ausgehend von ID 5 wird nun wieder geschaut, ob es einen Datensatz gibt, dessen Zeitstempel nicht weiter als 5min entfernt liegt. Gefunden wird ID 6. Und so weiter. Erst zw. ID 8 und ID 9 liegen mehr als 5min, also wird dieser Satz ignoriert, gleiches gilt für ID 10.

Hast du auch hierfür eine Lösung? Danke!

Okay. Das wäre dann wohl ein Fall für eine SRF-Funktion.

Andreas

Du könntest das Problem z.B. in eine Client-Funktion implementieren, und dort über eine Zwischenschicht wie SQLAlchemy bei Python das Statement für verschiedene Engines aufbereiten lassen. Wenn sich der Aufwand lohnt, unter normalem SQL sehe ich da wenig Chancen.

Gruß Uwe

Hallo und danke für die bisherigen Antworten!

Inzw. ist klar, dass Oracle das DBMS der Wahl ist. Was ist denn das Pendant zu Set Returning Functions in Oracle? Gibt es ggf. einen Ansatz unter Oracle mit temp. Tabellen als Zwischenspeicher an die Aufgabe heranzugehen?

Viele Grüße,
Firegirl

Gibt es denn keine Foren und Mailinglisten zu ORA?

Andreas