SQL Zweitbesten auswählen

Guten Tag,

für Klausurvorbereitung versuche ich grad diese Aufgabe zu lösen:
Aufgabenstellung:
Ermitteln Sie das aktuelle Höchstgebot für den Artikel a2! Der Betrag ergibt sich, in dem man das zweithöchste Gebot zu einem gegebenen Artikel ermittelt und hierauf € 0.5 hinzuaddiert

Lösung vom Professor:
select max(at1) + 0.5 as NeuesGebot
from ( select 0.5 as at1
from dual
union
select max( a.betrag ) as at1
from gebot a
where a.artikelnr = ‚a2‘
and a.betrag (Select max(betrag) from gebot where artikelNr = g.artikelNr and max(betrag) );

Kann mir bitte jemand sagen, ob meine Lösung richtig oder falsch ist und kann mir jemand vllt den SQL Statement von der Lösung des profs erklären?

Vielen Dank.

Hallo,

in deiner Lösung ist mindestens dieser Teil falsch:

**(**Select max(betrag) from gebot where artikelNr =
g.artikelNr and max(betrag) )

Ich verstehe nicht ganz, was du dir dabei gedacht hast (könntest du es vielleicht erklären?), aber Aggregatfunktionen in der WHERE-Klausel ergeben generell wenig Sinn.

Die Lösung vom Prof. mal von innen nach außen:

select 0.5 as at1
from dual

„dual“ ist eine Oracle-Eigenart und eine Tabelle mit genau einer Spalte und Zeile. Ergebnis ist also eine Tabelle mit einer Spalte „at1“ und einem Eintrag 0.5.

select max( a.betrag ) as at1
from gebot a
where a.artikelnr = ‚a2‘
and a.betrag

Hi Andreas

Bei meiner Lösung habe ich mir folgendes gedacht:
select g.betrag+0.5
from gebot g
where g.artikelNr=‚a2‘
and g.betrag =
(Select max(betrag) from gebot where artikelNr = g.artikelNr and betrag (Select max(betrag) from gebot where artikelNr = g.artikelNr and betrag wollte ich den maximalen Wert nehmen, welches aber wiederum kleiner sein muss (**) als der maximale Wert (Select max(betrag) from gebot where artikelNr = g.artikelNr)überhaupt.
Somit dachte ich, dass ich damit dann ja auf den 2.größten Wert komme. Ich weiß nicht genau, ob meine idee richtig sein könnte, aber zumindest habe ich mal so einen ähnlichen Ansatz bei einer Übung im Netz gesehen.

Gruß**

Hi,

Mit (Select max(betrag) from gebot where artikelNr =
g.artikelNr and betrag
wollte ich den maximalen Wert
nehmen, welches aber wiederum kleiner sein muss () als
der maximale Wert (Select max(betrag) from gebot where
artikelNr = g.artikelNr)überhaupt.

ja, das ist genau die richtige Idee (und die gleiche Idee wie in der Professorenlösung; dort kommt nur die Behandlung des Falles hinzu, dass kein zweihöchster Wert existiert). Dann hattest du dich oben verschrieben (dort war ein zusätzliches max() in der WHERE-Klausel).

Andreas

Hi Andreas

Habs nach deinem ersten Beitrag gemerkt, das ich mich verschrieben hab :smile:
Dank für deine Hilfe!!!
Gruß