Aufgabe 16 - SQL Aggregation & Grouping (E-Sports Analytics)
Aufgabe 16 - SQL Aggregation & Grouping
Abschnitt betitelt „Aufgabe 16 - SQL Aggregation & Grouping“Worum geht es?
Abschnitt betitelt „Worum geht es?“In dieser Übung werden Rohdaten zu aussagekräftigen Berichten verdichtet: mit Aggregatfunktionen zusammenfassen, mit GROUP BY gruppieren und mit HAVING filtern (siehe Kapitel 7 - Aggregation und Gruppierung). Im Expertenteil kommen gefilterte Aggregate, Zwischensummen und der Spitzenreiter je Region dazu.
Was Sie dafür brauchen
Abschnitt betitelt „Was Sie dafür brauchen“- Kapitel 7 - Aggregation und Gruppierung.
- Ein PostgreSQL-Server und ein SQL-Editor.
Welche Kompetenzen Sie erwerben und zeigen
Abschnitt betitelt „Welche Kompetenzen Sie erwerben und zeigen“- Sie verdichten Daten mit
COUNT,SUM,AVG,MIN,MAX. - Sie gruppieren mit
GROUP BYund filtern Gruppen mitHAVING. - Sie grenzen
WHEREvonHAVINGab und verstehen den Umgang mitNULL. - Sie nutzen gefilterte Aggregate und Zwischensummen und ermitteln Spitzenwerte je Gruppe.
Pädagogische Einordnung
Abschnitt betitelt „Pädagogische Einordnung“- Reproduktion: einfache Aggregate berechnen (Teil A).
- Reorganisation und Transfer: gruppieren und filtern (Teile B und C).
- Reflexion, Problemlösung und Urteilsbildung: fortgeschrittene Auswertungen entwickeln (Teil D).
Arbeitsaufträge
Abschnitt betitelt „Arbeitsaufträge“Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.
Schema und Testdaten
Abschnitt betitelt „Schema und Testdaten“CREATE TABLE teams ( team_id INT PRIMARY KEY, team_name VARCHAR(50), region VARCHAR(30));CREATE TABLE arenas ( arena_id INT PRIMARY KEY, arena_name VARCHAR(50), city VARCHAR(50), capacity INT);CREATE TABLE matches ( match_id INT PRIMARY KEY, team_id INT, arena_id INT, game VARCHAR(50), kills INTEGER);CREATE TABLE sponsorships ( sponsor_id INT PRIMARY KEY, sponsor_name VARCHAR(50), team_id INT);
INSERT INTO teams VALUES (1,'Cyber Vipers','Europe'),(2,'Neon Samurais','Asia'),(3,'Arctic Foxes','North America'),(4,'Desert Rats','Africa');INSERT INTO arenas VALUES (10,'Alpha Dome','Berlin',5000),(20,'Cyber Stadium','Tokyo',15000),(30,'Empty Hall','Unknown',500);INSERT INTO matches VALUES (101,1,10,'Valorant',45),(102,1,20,'League of Legends',30),(103,2,20,'Counter-Strike',12),(104,1,10,'Valorant',55),(105,99,10,'Dota 2',55);INSERT INTO sponsorships VALUES (501,'Red Bull',1),(502,'Logitech',1),(503,'Intel',3),(504,'Nvidia',NULL);Teil A - Basis-Statistiken
Abschnitt betitelt „Teil A - Basis-Statistiken“- Gesamtsumme aller Kills über alle Matches.
- Anzahl der verschiedenen Spiele in
matches. - Größte und kleinste Arena-Kapazität.
Teil B - Gruppierung
Abschnitt betitelt „Teil B - Gruppierung“- Anzahl der Teams je Region, sortiert nach Anzahl absteigend.
- Durchschnittliche Kills je Spiel.
- Je Teamname die Gesamtzahl der Sponsoren.
Teil C - Gruppen filtern (HAVING)
Abschnitt betitelt „Teil C - Gruppen filtern (HAVING)“- Teams mit durchschnittlich mehr als 40 Kills über ihre Matches.
- Arenen mit mehr als einem Match.
- Teams mit mehr als einem Sponsor und einem Match in einer Arena mit Kapazität über 10.000.
Teil D - Expertenteil: Gefilterte Aggregate, Zwischensummen, Spitzenreiter
Abschnitt betitelt „Teil D - Expertenteil: Gefilterte Aggregate, Zwischensummen, Spitzenreiter“- Gefiltertes Aggregat (
FILTER): In einer einzigen Abfrage je Team ausgeben: Gesamtzahl der Matches, davon Anzahl der Valorant-Matches, mit dem PostgreSQL-Konstruktcount(*) FILTER (WHERE game = 'Valorant'). Erklären, warum das eleganter ist als zwei getrennte Abfragen. - Zwischensummen (
ROLLUP): Die Kills je Region und eine Gesamtsumme über alle Regionen in einer Abfrage ausgeben, mitGROUP BY ROLLUP (region). Beschreiben, was die zusätzliche Zeile mitNULLin der Region-Spalte bedeutet. - Spitzenreiter je Region: Für jede Region den Teamnamen mit den meisten Gesamt-Kills ermitteln. Da Fensterfunktionen erst in der 4. Klasse behandelt werden, mit einer korrelierten Subquery oder einem Vergleich gegen das Gruppenmaximum lösen.
- NULL verstehen: Zeigen und erklären, wie
AVG(kills)undCOUNT(kills)mit fehlenden Werten umgehen und warumCOUNT(*)undCOUNT(spalte)unterschiedliche Ergebnisse liefern können. Nutzen Sie dazu den Sponsor'Nvidia'mitteam_id IS NULL.
Wissenscheck
Abschnitt betitelt „Wissenscheck“- Warum schlägt
SELECT region, team_name, COUNT(*) FROM teams GROUP BY regionfehl? - Warum kann man Aufgabe C.1 nicht mit
WHERE AVG(kills) > 40lösen? - Wie verhalten sich
AVG()undCOUNT(spalte)gegenüberNULL? - Was leistet
count(*) FILTER (WHERE ...)gegenüber zwei getrennten Abfragen? - Was bedeutet die zusätzliche
NULL-Zeile beiGROUP BY ROLLUP (region)?
- Die Datei
aufgabe16_aggregation.sqlmit allen Abfragen, fehlerfrei ausführbar, Schlüsselwörter konsistent groß, inklusive der Erklärungen aus Teil D als Kommentare.
HTL Villach, Schuljahr 2025-2026,
https://www.htl-villach.at