82 lines
4.2 KiB
SQL
82 lines
4.2 KiB
SQL
-- 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;
|
|
|