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
Tino: 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 |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!