Autor Beitrag
Jetstream
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222



BeitragVerfasst: Do 08.05.08 16:18 
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

_________________
Die folgenden Klangbeispiele sind Ergänzungen zum methodischen Aufbau der Textbeilage und dürfen nicht losgelöst von dieser behandelt werden.
Der nette Nachbar
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 67

Win XP, Suse Linux 9.3
Delphi 7, Delphi 2007, Borland C++ Builder 6, Java Builder 7
BeitragVerfasst: Do 08.05.08 16:34 
select bauer_id, apfel_id, schönheit where schönheit >= maximalwert group by bauer_id
hazard999
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 162

Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
BeitragVerfasst: Do 08.05.08 16:38 
tja klappt natürlich nicht, man muss entweder gruppieren oder aggregieren

ausblenden 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.

_________________
MOV EAX, Result;MOV BYTE PTR [EAX], $B9;MOV ECX, M.Data;MOV DWORD PTR [EAX+$1], ECX;MOV BYTE PTR [EAX+$5], $5A;MOV BYTE PTR [EAX+$6], $51;MOV BYTE PTR [EAX+$7], $52;MOV BYTE PTR [EAX+$8], $B9;MOV ECX, M.Code;MOV DWORD PTR [EAX+$9], ECX
Jetstream Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222



BeitragVerfasst: 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.

_________________
Die folgenden Klangbeispiele sind Ergänzungen zum methodischen Aufbau der Textbeilage und dürfen nicht losgelöst von dieser behandelt werden.
Der nette Nachbar
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 67

Win XP, Suse Linux 9.3
Delphi 7, Delphi 2007, Borland C++ Builder 6, Java Builder 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Do 08.05.08 19:48 
Nächster Versuch:
1. Die Zeitpunkte der neuesten Äpfel je Bauer.
ausblenden SQL-Anweisung
1:
2:
3:
4:
select   bauer_ID,
  max (erstellt) as Erstellt
from Apfel
group by bauer_ID

2. Die dazugehörigen Äpfel
ausblenden 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?
ausblenden 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.

_________________
Na denn, dann. Bis dann, denn.
hazard999
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 162

Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
BeitragVerfasst: Fr 09.05.08 07:44 
Hmm. Den zweiten Teil der Aufgabenstellung überlesen...

_________________
MOV EAX, Result;MOV BYTE PTR [EAX], $B9;MOV ECX, M.Data;MOV DWORD PTR [EAX+$1], ECX;MOV BYTE PTR [EAX+$5], $5A;MOV BYTE PTR [EAX+$6], $51;MOV BYTE PTR [EAX+$7], $52;MOV BYTE PTR [EAX+$8], $B9;MOV ECX, M.Code;MOV DWORD PTR [EAX+$9], ECX
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 09.05.08 07:50 
Wieso?

_________________
Na denn, dann. Bis dann, denn.
hazard999
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 162

Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
BeitragVerfasst: Fr 09.05.08 07:51 
Ich.

(Nur laut gedacht...)

_________________
MOV EAX, Result;MOV BYTE PTR [EAX], $B9;MOV ECX, M.Data;MOV DWORD PTR [EAX+$1], ECX;MOV BYTE PTR [EAX+$5], $5A;MOV BYTE PTR [EAX+$6], $51;MOV BYTE PTR [EAX+$7], $52;MOV BYTE PTR [EAX+$8], $B9;MOV ECX, M.Code;MOV DWORD PTR [EAX+$9], ECX
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 09.05.08 07:59 
Äh. wasndasn für ne Antwort?

Frage:Wieso?
Antwort:Ich!

Muh? :shock:

Ah..ja.

_________________
Na denn, dann. Bis dann, denn.
hazard999
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 162

Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
BeitragVerfasst: 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: )

_________________
MOV EAX, Result;MOV BYTE PTR [EAX], $B9;MOV ECX, M.Data;MOV DWORD PTR [EAX+$1], ECX;MOV BYTE PTR [EAX+$5], $5A;MOV BYTE PTR [EAX+$6], $51;MOV BYTE PTR [EAX+$7], $52;MOV BYTE PTR [EAX+$8], $B9;MOV ECX, M.Code;MOV DWORD PTR [EAX+$9], ECX
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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:

_________________
Na denn, dann. Bis dann, denn.
Jetstream Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222



BeitragVerfasst: 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!

_________________
Die folgenden Klangbeispiele sind Ergänzungen zum methodischen Aufbau der Textbeilage und dürfen nicht losgelöst von dieser behandelt werden.
Der nette Nachbar
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 67

Win XP, Suse Linux 9.3
Delphi 7, Delphi 2007, Borland C++ Builder 6, Java Builder 7
BeitragVerfasst: Fr 09.05.08 16:29 
Tja wieder mal was neues gelernt mein kleiner Freund xD
Jetstream Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222



BeitragVerfasst: 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):
ausblenden 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

_________________
Die folgenden Klangbeispiele sind Ergänzungen zum methodischen Aufbau der Textbeilage und dürfen nicht losgelöst von dieser behandelt werden.