-- DBS2.2.1.a:: -- Ermitteln Sie die Laufzeit von Kinofilmen (Type=C) aus dem Jahr 1990. Die Laufzeit ist in der Tabelle RUNS -- zu finden. Allerdings ist die Tabelle nicht vollständig. Geben Sie daher für Filme ohne einen Eintrag in -- RUNS den Wert 1 aus. Für manche Filme sind auch Laufzeiten in unterschiedlichen Ländern angegeben, ver- -- wenden Sie in diesem Fall die maximale Laufzeit. -- Hinweise: Verwenden Sie einen passenden OUTER JOIN, die Funktion COALESCE, sowie abschließend eine Gruppierung. -- Erwartete Spalten: ID, TITLE, WEEKS SELECT m.ID, m.TITLE, COALESCE(max(r.WEEKS), 1) AS WEEKS FROM moviedb.MOVIE m LEFT JOIN moviedb.RUNS r ON (m.ID = r.MOVIE) WHERE m.TYPE = 'C' AND m.YEAR = 1990 GROUP BY m.ID, m.TITLE; -- DBS2.2.1.b:: -- Finden Sie ID und Titel aller Kinofilme (type = 'C') aus dem Jahr 1990 und die Anzahl der darin -- auftretenden Charaktere. Geben Sie nur Kinofilme aus, für die mindestens 15 Charaktere gespeichert sind. -- Erwartete Spalten: ID, TITLE, CHR_COUNT SELECT m.ID, m.TITLE, COUNT(p.CHARACTER) AS CHR_COUNT FROM moviedb.MOVIE m JOIN moviedb.PLAYS p ON (m.ID = p.MOVIE) WHERE m.TYPE = 'C' AND m.YEAR = 1990 GROUP BY m.ID, m.TITLE HAVING COUNT(p.CHARACTER) >= 15; -- DBS2.2.1.c:: -- Berechnen Sie das durchschnittliche Rating für Regisseure von Kinofilmen (d.h. Type=C) -- aus den Jahren 1960 bis 1969. D.h.: selektieren Sie alle Regisseure, die in den Jahren 1960 bis 1969 -- mindestens einen Kinofilm hatten, und berechnen Sie für jeden dieser Regisseure das durchschnittliche -- Rating über alle Kinofilme des Regisseurs in diesen Jahren. -- Erwartete Spalten: Name, Rating SELECT p.NAME, AVG(r.RATING) FROM moviedb.MOVIE m JOIN moviedb.DIRECTS d ON (m.ID = d.MOVIE) JOIN moviedb.PERSON p ON (d.DIRECTOR = p.ID) JOIN moviedb.RATING r ON (m.ID = r.MOVIE) WHERE m.TYPE = 'C' AND m.YEAR >=1960 AND m.YEAR <= 1969 GROUP BY p.NAME HAVING COUNT(m.ID) > 0; -- DBS2.2.1.d:: -- Verwenden Sie das Ergebnis aus Aufgabe DBS2.2.1.c, um die Regisseure mit dem besten sowie die mit dem -- schlechtesten durchschnittlichen Rating in den Jahren 1960 bis 1969 zu ermitteln, d.h. Sie müssen die -- Lösung zur vorherigen Aufgabe als Unterabfrage verwenden, und diese so einschränken, dass nur die Top -- bzw. Flop-Regisseure gelistet werden. -- Hinweise: -- 1) Hier kann man gut Common Table Expressions verwenden, um einen lesbaren und strukturierten Query -- zu erhalten. -- 2) Gehen Sie schrittweise vor: Ermitteln Sie zunächst das Maximum und Minimum der durchschnittlichen -- Bewertungen; selektieren Sie dann die Regisseure, denen Rating einer dieser beiden Werte ist. Sie -- finden in der Vorlesung auf Folie 22 und 25 ein ähnliches Beispiel; die Lösung zu dieser Aufgabe ist -- allerdings etwas komplizierter, da sie nicht auf eine Tabelle, sondern das Ergebnis einer anderen -- Abfrage zugreifen, und da sowohl MIN als auch MAX gesucht werden soll. -- Erwartete Spalten: name, rating WITH avg_dir_rating(ID, NAME, RATING) AS ( SELECT p.ID, p.NAME, AVG(R.RATING) FROM moviedb.MOVIE m JOIN moviedb.DIRECTS d ON (m.ID = d.MOVIE) JOIN moviedb.PERSON p ON (d.DIRECTOR = p.ID) JOIN moviedb.RATING r ON (m.ID = r.MOVIE) WHERE m.TYPE = 'C' AND m.YEAR >=1960 AND m.YEAR <= 1969 GROUP BY p.NAME, p.ID HAVING COUNT(m.ID) > 0 ) SELECT r.NAME, r.RATING FROM avg_dir_rating r WHERE r.RATING = (SELECT MAX(RANK() OVER (ORDER BY RATING ASC)) FROM avg_dir_rating) OR r.RATING = (SELECT MAX(RANK() OVER (ORDER BY RATING DESC)) FROM avg_dir_rating); -- DBS2.2.1.e:: -- Wiederholen Sie Aufgabe DBS2.2.1.d, verwenden Sie jetzt aber die Analytische Funktion RANK, um die Regisseure -- mit dem besten bzw. schlechtesten durchschnittlichen Rating zu ermitteln. Beachten Sie dabei, dass man -- jederzeit auch mehrere Analytische Funktionen parallel mit unterschiedlichen Parametern verwenden kann, -- d.h. sie können einmal den RANK nach Rating aufsteigend und einmal den RANK nach Rating absteigend er- -- mitteln. Dann können Sie in der letzten Abfrage die Datensätze selektieren, bei denen entweder der erste RANK -- 1 (Top bzgl. aufsteigender Sortierung) oder der zweite RANK 1 (d.h. Top bzgl. absteigender Sortierung) ist. Tragen Sie hier Ihre Lösung für Aufgabe DBS2.2.1.e ein, mit Semikolon beendet;