Oracle aus zwei zeilen nur einen auswählen

Guten Tag,
hallo liebe Nutzer,
nach dem ich schon genug Zeit im Internet recherchiert habe leider erfolgslos wende ich mich an euch und hoffe das ihr mir helfen könnt.
ich habe folgendes Problem :
ich habe zwei Tabellen die mit der ID als eindeutigen schlüssel verbunden sind.
die Tabelle1 enthält unteranderem zwei spalten
ID,datum1
die tabelle2 enthält unteranderem spalten
ID,datum2,
Meine Abfrage soll die DIFFERENZ datum2 - datum1 berechnen und mit ID, DIFFERENZ ausgegeben werden, was nicht weiter schwierig ist, das eigentliche Problem besteht daran dass in der tabelle2 manchmal mehrere zeilen mit unterschiedlichem Datum zur einer ID stehen
zB ID2 datum2
1 06.09.99
1 10.09.99
2 02.07.00
2 03.07.00

für meine Abfrage bräuchte ich nur das Datum2 die am weitesten in der Vergangenhiet liegt (das wäre dann in dem beispiel oben, das datum 06.09.99 für ID 1 und 02.07.00 für ID 2.
und damit am nähesten zum datum 1 ist.
Ist das überhaupt umsetzbar?

Ich werde dankbar für jeden Hinweis/Hilfe

Evilyn

Liebe Evilyn,

Deine Anfrage müsste mit einer Min-Funktion und einer Group By Funktion realisierbar sein. Eine Anmerkung von Dir ist nur etwas fraglich: Möchtest Du generell das kleinste Datum (ältestes Datum, d.h. am weitesten zurückliegend) ausgegeben haben oder das, welches am nächsten am Datum1 dran ist. Je nachdem musst Du die Min-Funktion nämlich entweder auf das Datum2 anwenden oder auf die berechnete Differenz.

Ich habe die Abfrage zwar nicht geprüft, aber sie müsste in etwa so gehen:

  1. ältestes Datum:
    SELECT Tabelle1.ID as ID, Datum1 - MIN(Tabelle2.Datum2) AS Differenz
    FROM Tabelle1, Tabelle2
    WHERE Tabelle1.ID = Tabelle2.ID
    GROUP BY ID;

  2. am nächsten zum Datum1:
    SELECT Tabelle1.ID as ID, MIN(Datum1 - Datum2) AS Differenz
    FROM Tabelle1, Tabelle2
    WHERE Tabelle1.ID = Tabelle2.ID
    GROUP BY ID;

Noch ein paar Hinweise zum Schluss:
-Evtl. muss die Differenz noch mit einer Formatfunktion oder Typumwandlungsfunktion in Integer umgewandelt werden.
-ID kann bei manchen SQL-Servern auf Fehler laufen, da es sich um ein Schlüsselwort handelt.
-Evtl. wird in der GROUP BY-Funktion der Alias ID nicht erkannt. Schreibe dazu: GROUP BY Tabelle1.ID
-Bei der zweiten Variante darauf achten, dass zukünftige Datümer bei der Differenzbildung zum Datum1 immer eine negative Zahl ergeben und somit bei der MIN-Funktion ermittelt werden.

Ansonsten dürfte alles so klappen, wie Du wolltest - falls noch Fragen sind, einfach wieder melden :smile:

Grüße
Surfin Willy

Lieber Surfin Willy,
danke für deine schnelle Antwort!
Ich bekomme mit der Query die Ergebnisse die ich brauche- danke noch mal. Bei meiner Anmerkung fehlte die Info dass datum1 nicht grösser als datum2 sein darf!
Aber das ist jetzt auch egal.
Könntest du mir freundlicherweise vielleicht noch einen Hinweis geben für mein nächstes Problem wie ich die Ergebnisse aus zwei Querys in Form (ID,Datum1) (ID,Datum2) voneinander subtrahiere bzw.nur die Datumseinträge weil die ID gleich sind. Habe versucht die zwei Abfragen mit UNION ALL zu verbinden-die liefert mir aber die ID,DATUM1, ID,DATUM2 hintereinander. Brauche ich dafür eine Subquery um die Datums voneinander abzuziehen? Wäre schön wenn du mir noch mal helfen und einen Hinweis geben könntest?

Grüsse
Evilyn

Du kannst eine View (Query) auch wie eine ganz normale Tabelle behandeln. Voraussetzung dafür ist aber, dass die Query irgendwo fest niedergeschrieben steht und einen Namen hat (z.B. View1 oder Query1). Sollte die Query zur Laufzeit, also während des Ausführens erst erstellt und ausgeführt werden, sieht die Lösung eher schlecht aus (mir fällt keine ein :wink:).
Die meisten Entwicklungsprogramme bieten aber die Möglichkeit, die Queries abzuspeichern. Andernfalls muss man diese mit CREATE VIEW Query1 AS …erstellen. Dann sollte es so möglich sein:

Beispiel:
Query1: SELECT ID, Datum1 FROM Tabelle1;
Query2: SELECT ID, Datum2 FROM Tabelle2;

Angenommen, Deine Queries (Views) heißen nun auch Query1 bzw. Query2, dann kannst Du sie so ansprechen, als wären es Tabellen:
SELECT Query1.ID, (Datum2 - Datum1) AS Datumsdifferenz
FROM Query1, Query2
WHERE Query1.ID = Query2.ID;

Die WHERE-Klausel ist auch hier wichtig, da Du sonst ein (etwas) unsinniges Kreuzprodukt aus beiden Queries bekommst (d.h. jede Zeile der einen Tabelle/Query mit JEDER Zeile der anderen Tabelle/Query kombiniert).

Die große Frage stellt sich mir nur: Warum greifst Du nicht gleich auf die beiden Tabellen zurück? Dies würde ja auch funktionieren, wenn die Abfrage erst zur Laufzeit ausgeführt würde, da Tabellen immer existent sind (sofern angelegt), wohingegen Queries, die zur Laufzeit erstellt werden, nur solange existent sind, wie das Programm läuft (genauer: nur zu dem Zeitpunkt, zu dem sie aufgerufen werden).

1 Like

hallo Surfin Willy

danke fuer deine schnelle Hilfe!Du hast recht - wenn die Tabellen exisitieren waere es radsamer die Abfragen auf die Tabellen und nicht auf die erstellte views anzuwenden, die Frage stellt sich fuer mich nur wie ich das machen soll- mit den Querys hat es funktioniert, ich habe die ergebnnisse der querys zu einem produkt gemacht und daraus das Ergebniss bekommen, wenn ich es ohne views machen wuerde, musste ich eine subquery bauen die mir das produkt der beiden Querys/Views liefer und darauf meine subtraktion anwenden? ist das so einfach?- uebersehe ich da was?
Danke Dir noch mal.
Ewelina

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

also man nehme einen JOIN:
select t1.id, to_char(t1.datum1-t2.datum2,'DD.MM.YYYY HH24:MI:SS) – Differenz als Datum/Uhrzeit dargestellt)
from tabelle1 t1, tabelle2 t2 – Tabellen mit Alias
where t1.id = t2.id – Join-Bedingung (alte SQL-Schreibweise)

Dein letzten Absatz verstehe ich nicht so ganz.

cu
Jorg

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]