a2.1 start
This commit is contained in:
parent
c021cc1fbc
commit
4d1bacc9d4
|
@ -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;
|
||||
|
Loading…
Reference in New Issue