-- 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;

