\documentclass{bschlangaul-aufgabe} \bLadePakete{normalformen,rmodell,syntax} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 7}, Thematik = {Zehnkampf}, Referenz = 66116-2020-F.T1-TA2-A7, RelativerPfad = Examen/66116/2020/03/Thema-1/Teilaufgabe-2/Aufgabe-7.tex, ZitatSchluessel = examen:66116:2020:03, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {SQL, SQL mit Übungsdatenbank, Top-N-Query}, EinzelpruefungsNr = 66116, Jahr = 2020, Monat = 03, ThemaNr = 1, TeilaufgabeNr = 2, AufgabeNr = 7, } \let\FA=\bFunktionaleAbhaengigkeiten Gegeben sei die Relation \emph{Zehnkampf}, welche die Ergebnisse eines Zehnkampfwettkampfes verwaltet. Eine beispielhafte Ausprägung ist in nachfolgender Tabelle gegeben. \index{SQL} \footcite{examen:66116:2020:03} \textbf{Hinweise:} Jeder Athlet kann in jeder Disziplin maximal ein Ergebnis erzielen. Außerdem können Sie davon ausgehen, dass jeder Name eindeutig ist. \begin{center} \begin{tabular}{|l|l|l|l|l|} \hline Name & Disziplin & Leistung & Einheit & Punkte \\\hline John & 100m & 10.21 & Sekunden & 845 \\ Peter & Hochsprung & 213 & Zentimeter & 812 \\ Peter & 100m & 10.10 & Sekunden & 920 \\ Hans & 100m & 10.21 & Sekunden & 845 \\ Hans & 400m & 44.12 & Sekunden & 910 \\ $\dots$ & $\dots$ & $\dots$ & $\dots$ & $\dots$ \\ \end{tabular} \end{center} \begin{enumerate} % Datenbankname: Zehnkampf \begin{minted}{sql} CREATE TABLE Zehnkampf ( Name VARCHAR(30), Disziplin VARCHAR(30), Leistung FLOAT, Einheit VARCHAR(30), Punkte INTEGER, PRIMARY KEY(Name, Disziplin, Leistung) ); INSERT INTO Zehnkampf VALUES ('John', '100m', 10.21, 'Sekunden', 845), ('Peter', 'Hochsprung', 213, 'Zentimeter', 812), ('Peter', '100m', 10.10, 'Sekunden', 920), ('Hans', '100m', 10.21, 'Sekunden', 845), ('Hans', '400m', 44.12, 'Sekunden', 910); \end{minted} \index{SQL mit Übungsdatenbank} %% % a) %% \item Bestimmen Sie alle funktionale Abhängigkeiten, die \textbf{sinnvollerweise} in der Relation Zehnkampf gelten. \begin{bAntwort} \FA{ Disziplin -> Einheit; Disziplin, Leistung -> Punkte; Name, Disziplin -> Leistung; } \end{bAntwort} %% % b) %% \item Normalisieren Sie die Relation Zehnkampf unter Beachtung der von Ihnen identifzierten funktionalen Abhängigkeiten. Unterstreichen Sie alle Schlüssel des resultierenden Schemas. \begin{bAntwort} \bRelationMenge{$R_1$}{\bPrimaer{Disziplin}, Einheit} \bRelationMenge{$R_2$}{\bPrimaer{Disziplin}, \bPrimaer{Leistung}, Punkte} \bRelationMenge{$R_3$}{\bPrimaer{Name}, \bPrimaer{Disziplin}, Leistung} \end{bAntwort} %% % c) %% \item Bestimmen Sie in SQL den Athleten (oder bei Punktgleichheit, die Athleten), der in der Summe am meisten Punkte in allen Disziplinen erzielt hat. Benutzen Sie dazu die noch nicht normalisierte Ausgangsrelation \emph{Zehnkampf}. \index{Top-N-Query} \begin{bAntwort} \begin{minted}{sql} CREATE VIEW GesamtPunkte AS SELECT Name, SUM(Punkte) As Punkte FROM Zehnkampf GROUP BY Name; SELECT g1.Name, g1.Punkte, COUNT(*) AS Rang FROM GesamtPunkte g1, GesamtPunkte g2 WHERE g1.Punkte <= g2.Punkte GROUP BY g1.Name, g1.Punkte HAVING COUNT(*) = 1; \end{minted} \begin{minted}{md} name | punkte | rang ------+--------+------ Hans | 1755 | 1 (1 row) \end{minted} \end{bAntwort} \end{enumerate} \end{document}