diff --git a/a2.1/a2.1.sql b/a2.1/a2.1.sql new file mode 100644 index 0000000..a0ebd14 --- /dev/null +++ b/a2.1/a2.1.sql @@ -0,0 +1,81 @@ +-- 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; +