| Autor |
Beitrag |
Jetstream
      
Beiträge: 222
|
Verfasst: 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
      
Beiträge: 67
Win XP, Suse Linux 9.3
Delphi 7, Delphi 2007, Borland C++ Builder 6, Java Builder 7
|
Verfasst: Do 08.05.08 16:34
select bauer_id, apfel_id, schönheit where schönheit >= maximalwert group by bauer_id
|
|
hazard999
      
Beiträge: 162
Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
|
Verfasst: 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 Tino: 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 
      
Beiträge: 222
|
Verfasst: 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
      
Beiträge: 67
Win XP, Suse Linux 9.3
Delphi 7, Delphi 2007, Borland C++ Builder 6, Java Builder 7
|
Verfasst: 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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.
_________________ Na denn, dann. Bis dann, denn.
|
|
hazard999
      
Beiträge: 162
Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
|
Verfasst: 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 09.05.08 07:50
Wieso?
_________________ Na denn, dann. Bis dann, denn.
|
|
hazard999
      
Beiträge: 162
Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
|
Verfasst: 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 09.05.08 07:59
Äh. wasndasn für ne Antwort?
Frage:Wieso?
Antwort:Ich!
Muh?
Ah..ja.
_________________ Na denn, dann. Bis dann, denn.
|
|
hazard999
      
Beiträge: 162
Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
|
Verfasst: 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  )
_________________ 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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... 
_________________ Na denn, dann. Bis dann, denn.
|
|
Jetstream 
      
Beiträge: 222
|
Verfasst: 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
      
Beiträge: 67
Win XP, Suse Linux 9.3
Delphi 7, Delphi 2007, Borland C++ Builder 6, Java Builder 7
|
Verfasst: Fr 09.05.08 16:29
Tja wieder mal was neues gelernt mein kleiner Freund xD
|
|
Jetstream 
      
Beiträge: 222
|
Verfasst: 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 |
_________________ Die folgenden Klangbeispiele sind Ergänzungen zum methodischen Aufbau der Textbeilage und dürfen nicht losgelöst von dieser behandelt werden.
|
|
|