Entwickler-Ecke

Datenbanken - [MSSQL] Komplizierter Query


Jetstream - Do 08.05.08 16:18
Titel: [MSSQL] Komplizierter Query
Hallöchen,
ich habe ein kleines Problem mit einem SQL-Query, die Situation ist folgende:

Im fernen Land Fantasia gehen die fleißigen Bauern ihrem Tagewerk nach, sie gießen ihre Apfelbäume. Damit unter den Bauern kein Streit entsteht, hat jeder Bauer nur einen einzelnen Baum.
Täglich wachsen an jedem Baum mehrere Äpfel, zu jedem Apfel wird das Datum des Entstehenes in der Datenbank festgehalten. Die Äpfel bleiben auch unbegrenzt lange an den Bäumen, denn in Fantasia hat man genug zu essen und hat die Apfelbäume nur, weil sie so schön aussehen.
Jeder Apfel hat ein weiteres Attribut "Schönheit" (Integer), das ihm beim Entstehen, je nachdem wie gut der Bauer gearbeitet hat, verliehen wird.

Da den Bauern mit der Zeit langweilig wird, hätten sie gerne einen kleinen Wettbewerb: Sie würden gerne wissen, welcher Bauer aktuell den Apfel mit der größten Schönheit besitzt und welche ID dieser Apfel hat. Dabei soll aber von jedem Baum nur der neueste Apfel gewertet werden.

Die Tabellen sind:

Bauer
- id

Apfel
- id
- bauer_id
- erstellt
- schönheit

Ich hoffe ihr könnt mir helfen.

Gruß,
Jetstream


Der nette Nachbar - Do 08.05.08 16:34

select bauer_id, apfel_id, schönheit where schönheit >= maximalwert group by bauer_id


hazard999 - Do 08.05.08 16:38

tja klappt natürlich nicht, man muss entweder gruppieren oder aggregieren


SQL-Anweisung
1:
2:
3:
select bauer_id, apfel_id
from aepfel
where schoenheit = (select max(schoenheit) from aepfel)

das sollte gehen

Moderiert von user profile iconTino: Sql-Tags hinzugefügt.


Jetstream - Do 08.05.08 16:45

Danke für die Vorschläge.

Der Query von hazard ist schon sehr schön, aber er wählt nicht den besten jeweils neuesten Apfel von jedem Baum aus, sondern bezieht auch alle alten Äpfel mit ein.

// Edit:
Zusätzlich wäre noch die Möglichkeit ganz schön, statt dem einen besten Bauern die besten n Bauern auszugeben.


Der nette Nachbar - Do 08.05.08 16:53

Natürlich klappt es nicht, war ja auch nur mal aus dem Handgelenk und völlig ungetestet xD


alzaimar - Do 08.05.08 19:48

Nächster Versuch:
1. Die Zeitpunkte der neuesten Äpfel je Bauer.

SQL-Anweisung
1:
2:
3:
4:
select   bauer_ID,
  max (erstellt) as Erstellt
from Apfel
group by bauer_ID

2. Die dazugehörigen Äpfel

SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
select 
        x.Bauer_ID,
  ID as ApfelID,           
  max (Erstellt) as Erstellt,
        max (Schoenheit) as Schoenheit
from (
  select bauer_ID,
   max (erstellt) as Erstellt
    from Bauer
   group by bauer_ID
  ) x join Apfel where x.Erstellt = Apfel.erstellt and x.bauer_ID = Apfel.bauer_ID
group by x.Bauer_ID

Würg, nun könnten zwei Äpfel, die am selben Tag entstanden sind auch gleich hübsch sein. Willst Du dann nur einen sehen?

SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
select x.Bauer_ID,
       max (ID) as ApfelID,
       max (x.Erstellt) as Erstellt,
       max (x.Schoenheit) as Schoenheit
(  
  select x.Bauer_ID,
   ID as ApfelID,           
   max (Schoenheit) as Schoenheit
   from (
    select bauer_ID,
     max (erstellt) as Erstellt
      from Bauer
     group by bauer_ID
    ) x join Apfel where x.Erstellt = Apfel.erstellt and x.bauer_ID = Apfel.bauer_ID
  group by x.Bauer_ID
  ) x 
group by Bauer_ID

ungetestet.


hazard999 - Fr 09.05.08 07:44

Hmm. Den zweiten Teil der Aufgabenstellung überlesen...


alzaimar - Fr 09.05.08 07:50

Wieso?


hazard999 - Fr 09.05.08 07:51

Ich.

(Nur laut gedacht...)


alzaimar - Fr 09.05.08 07:59

Äh. wasndasn für ne Antwort?

Frage:Wieso?
Antwort:Ich!

Muh? :shock:

Ah..ja.


hazard999 - Fr 09.05.08 08:12

Wieso ist auch eine "seltsame" Frage... :?

Warum ich überlesen habe? KA. Gestern zuviel Stress. Altersdemenz. "Schassaugert" wies bei uns in Österreich gern heisst...

Ich habe gedacht du hast meinen Post auf deinen bezogen... (zuwenig Kaffee heute noch gehabt :eyes: )


alzaimar - Fr 09.05.08 08:25

Ösi: "Hmm...Den zweiten Teil der Aufgabe überlesen"
Piefke: "Wieso?"
Ösi: "Ich"

Treffender kann man das Verständnis zwischen unseren Kulturkreisen nicht beschreiben.

Ich begrüße natürlich, das sich Österreicher und Deutsche zum Zwecke der Intensivierung der nationalen Identität auch sprachlich von einander weg bewegen, bedaure dies aber in diesem Fall ausdrücklich.

Kann aber auch am Kaffee liegen. Und mindestens da seit ihr uns um Lichtjahre voraus. Ich schlage vor, wir fördern die Kaffeebauern und vernichten einen Teil der angesammelten Bestände durch Überbrühung mit heißem Wasser und anschließender oralen Verklappung. Ihr macht da noch natürlich irgendwelche geheimen Mixturen rein damit das *lecker* wird, so gut sind wir nicht... :zwinker:


Jetstream - Fr 09.05.08 14:22

Woohoo, es klappt :)

Vielen Dank an alle, speziell an hazard und alzaimar!

Der Subquery von alzaimar hat die entscheidende Lösung gebracht. Ich wusste gar nicht, dass man einem Subquery in einer from-clause einfach einen Namen geben kann (hier x) und dann darauf referenziert. Genial!


Der nette Nachbar - Fr 09.05.08 16:29

Tja wieder mal was neues gelernt mein kleiner Freund xD


Jetstream - Mi 14.05.08 16:16

Zum Abschluss der gesuchte Query, der die besten 10 Bauern und die Schönheit des jeweils neuesten Apfels ausgibt (ungetestet):

SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
SELECT 
TOP 10 
  b.name,
  a.schönheit
FROM
  (
  SELECT 
    bauer_id,
    max(erstellt) AS erstellt
  FROM 
    apfel 
  GROUP BY 
  bauer_id
  ) x
  INNER JOIN apfel a ON a.bauer_id = x.bauer_id AND a.erstellt = x.erstellt
  INNER JOIN bauer b ON b.id = a.bauer_id
ORDER BY
  a.schönheit DESC