SQL Komplexe Abfrage

aggitron

Commander
Registriert
Jan. 2006
Beiträge
2.074
Hallo,

ich bräuchte eine komplexere Abfrage, habe aber selbst kaum Erfahrung über Standardabfragen hinaus.

Ich habe folgende Tabelle:

Code:
ID;Produkt;Nummer;Datum
1;Löffel;0;12-10-2014
2;Löffel;1;12-10-2014
3;Löffel;2;01-01-2015
4;Löffel;3;02-08-2014
5;Gabel;0;02-09-2015
6;Gabel;1;14-08-2015

Ich möchte nun jedes Datum der Nummer 0 ausgeben, sowie alle mit einen Datum >= dem von Nummer 0.
Die Ausgabe müsste also so aussehen:

Code:
ID;Produkt;Nummer;Datum
1;Löffel;0;12-10-2014
2;Löffel;1;12-10-2014
3;Löffel;2;01-01-2015
5;Gabel;0;02-09-2015

Ist sowas möglich, wenn ja, wie muss die Abfrage lauten?
 
Da musst du wohl oder übel ein wenig konkreter werden, ich konnte die Logik dahinter zumindest nicht identifizieren.

Wieso ist Löffel Nummer 2 dabei, 3 aber nicht, wieso fehlt Gabel 1? Weil die Daten der jeweiligen Produkte dann kleiner sind?
 
Zuerst holst du dir das Datum der 0 des jeweiligen Gegenstandes. Dann gehst du diese der Reihe nach durch.

Ich denke da an nen CURSOR der das erledigt. Vllt. geht's auch einfacher. Einfach mal nach suchen, sonst schreib ich später evtl. noch was dazu.
 
Falls ich richtig verstanden habe, was du brauchst, dann sollte die hier funktionieren:

Code:
SELECT *
FROM `produkte` p1
WHERE p1.nummer =0
OR p1.datum >= ALL (
  SELECT p2.datum
  FROM produkte p2
  WHERE p1.produkt = p2.produkt
  AND p2.nummer =0
)

Ergebnis:
Code:
id	produkt	nummer 	datum
1	Löffel	0	2014-10-12
2	Löffel	1	2014-10-12
3	Löffel	2	2015-01-01
5	Gabel	0	2015-09-02

€dit: Funktioniert auch dann, wenn es mehrere Einträge mit Nummer 0 gibt, da es durch ALL mit allen gefundenen Einträgen vergleicht.
 
Zuletzt bearbeitet: (ALL erläutert.)
So geht's auch (und einfacher). Das ALL hat mir gefehlt in meiner Logik. ;)
 
Das sieht schon super aus. Vielen Dank!

Ich habe aber noch ein Problem. In dieser Tabelle (1.044.000 Datensätze) stehen auch die historischen Daten.
D.h.

Code:
ID;Produkt;Nummer;Datum
1;Löffel;0;10-10-2011
2;Löffel;0;12-12-2012
3;Löffel;0;12-02-2013
4;Löffel;0;12-10-2014
5;Löffel;1;12-05-2013
6;Löffel;1;12-10-2014
7;Löffel;2;03-01-2013
8;Löffel;2;01-12-2013
9;Löffel;2;01-01-2015
10;Löffel;3;02-08-2014
11;Gabel;0;12-05-2013
11;Gabel;0;03-08-2014
11;Gabel;0;02-09-2015
12;Gabel;1;14-08-2015

Er soll aber immer nur das aktuellste Datum einer Produkt/Nummer Kombination für die Abfrage heran ziehen. Müsste man das eventuell über eine "Vorselektion" realisieren?
 
Jo. Das könnte dann z.B. so aussehen:

Code:
SELECT *
FROM `produkte` p1
WHERE (
  p1.nummer =0
  AND datum = (
  SELECT MAX( p3.datum )
  FROM produkte p3
  WHERE p3.nummer =0
  AND p3.produkt = p1.produkt )
)
OR p1.datum >= ALL (
  SELECT p2.datum
  FROM produkte p2
  WHERE p1.produkt = p2.produkt
  AND p2.nummer =0
)
 
Danke dir! Das frisst meine DB2 irgendwie nicht. Kurzes googlen ergab das MAX() wohl nur in Kombination mit GROUP BY funktioniert.
 
Schade - MySQL kann das. Dann probier es doch mal so:

Code:
SELECT *
FROM `produkte` p1
WHERE (
p1.nummer =0
AND datum = (
  SELECT p3.datum
  FROM produkte p3
  WHERE p3.nummer =0
  AND p3.produkt = p1.produkt
  AND p3.datum > ALL (
    SELECT p4.datum
    FROM produkte p4
    WHERE p4.id <> p3.id
  ) )
)
OR p1.datum >= ALL (
  SELECT p2.datum
  FROM produkte p2
  WHERE p1.produkt = p2.produkt
  AND p2.nummer =0
)
 
Das funktioniert! :)

Lässt sich auch noch einbauen ein bestimmtes Datum als Grenze zu setzen? D.h. falls ein Datum in der Zukunft liegt, möchte ich trotzdem nur die aktuellen Sätze sehen. Also bspw. die aktuellsten Sätze >= 01.07.2015.

Ich denke dann ist die Abfrage perfekt.

/edit
Ok, das mit dem Datum habe ich selbst rausgefunden. ;)
 
Zuletzt bearbeitet:
Zurück
Oben