DonCamillo
Grünschnabel
Hallo zusammen,
meine Datenbanktage im Studium sind schon einige Zeit her und dementsprechend nicht mehr vollständig parat.
Ich habe ein kleines Problemchen mit einem Join über 3 Tabellen.
- Tabelle spieler mit id (PK), nachname, vorname, alter, ...
- Tabelle entwicklung mit spielerId (FK), staerkeId (PK FK)
- Tabelle staerke mit staerkeId (PK), staerke, jahr
(In der Tabelle staerke sind pro Halbjahr alle Stärken von 1-10 aufgeführt)
Jeder Spieler entwickelt sich 2x pro Jahr (--> jahr = 201001, 201002, 201101 etc. als integer-Zahl). Entweder wird er besser, schlechter oder er behält seine Stärke. Jetzt will ich mehrere Fälle rausfinden:
1. Der Spieler wurde in der letzten Entwicklung besser. (z. B. von Stärke 4 auf 5)
2. Der Spieler wurde in der letzten Entwicklung schlechter. (z. B. von Stärke 5 auf 4)
3. Der Spieler blieb in der letzten Entwicklung gleich. (z. B. von Stärke 10 auf 10)
4. Der Spieler war in seinen früheren Tagen schon einmal stärker als aktuell. (z. B. Stärke zum Zeitpunkt 200501 10, danach immer 9)
Den Join habe ich soweit schon hinbekommen:
Mit GROUP BY spieler.id kann ich noch bspw. die maximale und minimale Stärke pro Spieler ausgeben.
Allerdings habe ich keine Ahnung (2h schon rumprobiert), wie ich den Bezug der Stärke zum Jahr machen kann. Konkret also sollten nur die spieler.id rausgegeben werden, wo der Spieler seine staerke im jahr 201101 größer hatte als im jahr 201002 (Fall 1, s. o.).
Mein Ansatz wäre etwas à la
(Fall 4)
Kann mir irgendjemand evtl. einen Hinweis geben, wie ich den Bezug zwischen staerke und jahr hinbekomme, sortiert nach spieler.id?
Vielen Dank im Voraus!
meine Datenbanktage im Studium sind schon einige Zeit her und dementsprechend nicht mehr vollständig parat.
Ich habe ein kleines Problemchen mit einem Join über 3 Tabellen.
- Tabelle spieler mit id (PK), nachname, vorname, alter, ...
- Tabelle entwicklung mit spielerId (FK), staerkeId (PK FK)
- Tabelle staerke mit staerkeId (PK), staerke, jahr
(In der Tabelle staerke sind pro Halbjahr alle Stärken von 1-10 aufgeführt)
Jeder Spieler entwickelt sich 2x pro Jahr (--> jahr = 201001, 201002, 201101 etc. als integer-Zahl). Entweder wird er besser, schlechter oder er behält seine Stärke. Jetzt will ich mehrere Fälle rausfinden:
1. Der Spieler wurde in der letzten Entwicklung besser. (z. B. von Stärke 4 auf 5)
2. Der Spieler wurde in der letzten Entwicklung schlechter. (z. B. von Stärke 5 auf 4)
3. Der Spieler blieb in der letzten Entwicklung gleich. (z. B. von Stärke 10 auf 10)
4. Der Spieler war in seinen früheren Tagen schon einmal stärker als aktuell. (z. B. Stärke zum Zeitpunkt 200501 10, danach immer 9)
Den Join habe ich soweit schon hinbekommen:
SQL:
SELECT spieler.id, staerke.staerke, staerke.jahr
FROM (
spieler
INNER JOIN entwicklung ON spieler.id = entwicklung.spielerId
)
LEFT JOIN staerke ON entwicklung.staerkeId = staerke.staerkeId
WHERE spieler.alter between 20 and 25
Mit GROUP BY spieler.id kann ich noch bspw. die maximale und minimale Stärke pro Spieler ausgeben.
Allerdings habe ich keine Ahnung (2h schon rumprobiert), wie ich den Bezug der Stärke zum Jahr machen kann. Konkret also sollten nur die spieler.id rausgegeben werden, wo der Spieler seine staerke im jahr 201101 größer hatte als im jahr 201002 (Fall 1, s. o.).
Mein Ansatz wäre etwas à la
SQL:
SELECT spieler.id, staerke.staerke, staerke.jahr
FROM (
spieler
INNER JOIN entwicklung ON spieler.id = entwicklung.spielerId
)
LEFT JOIN staerke ON entwicklung.staerkeId = staerke.staerkeId
WHERE spieler.alter between 20 and 25
GROUP BY spieler.id
HAVING MAX(staerke.staerke) <> (SELECT max(staerke) from ... where jahr <> 201101)
Kann mir irgendjemand evtl. einen Hinweis geben, wie ich den Bezug zwischen staerke und jahr hinbekomme, sortiert nach spieler.id?
Vielen Dank im Voraus!
Zuletzt bearbeitet von einem Moderator: