Fensterfunktionen

Datenbearbeitung in SQL

Mona Khalil

Data Scientist, Greenhouse Software

Arbeiten mit aggregierten Werten

  • Du musst GROUP BY für alle nicht aggregierten Spalten verwenden
SELECT
  country_id,
  season,
  date,
  AVG(home_goal) AS avg_home
FROM match
GROUP BY country_id;
ERROR: column "match.season" must appear in the GROUP BY 
clause or be used in an aggregate function
Datenbearbeitung in SQL

Nun zu den Fensterfunktionen!

  • Berechnungen zu einem bereits erstellten Ergebnissatz (einem Fenster)
  • Aggregierte Berechnungen
    • Ähnlich wie bei Unterabfragen in SELECT
    • Laufende Summen, Ranglisten, gleitende Durchschnitte
Datenbearbeitung in SQL

Was ist eine Fensterfunktion?

  • Wie viele Tore wurden in den jeweiligen Spielen der Saison 2011/12 geschossen und wie verhält sich das zum Gesamtdurchschnitt?
SELECT
  date,
  (home_goal + away_goal) AS goals,
  (SELECT AVG(home_goal + away_goal) 
     FROM match
     WHERE season = '2011/2012') AS overall_avg
FROM match
WHERE season = '2011/2012';
| date       | goals | overall_avg       |
|------------|-------|-------------------|
| 2011-07-29 | 3     | 2.71646           |
| 2011-07-30 | 2     | 2.71646           |
| 2011-07-30 | 4     | 2.71646           |
| 2011-07-30 | 1     | 2.71646           |
Datenbearbeitung in SQL

Was ist eine Fensterfunktion?

  • Wie viele Tore wurden in den jeweiligen Spielen der Saison 2011/12 geschossen und wie verhält sich das zum Gesamtdurchschnitt?
SELECT
    date,
    (home_goal + away_goal) AS goals,
    AVG(home_goal + away_goal) OVER() AS overall_avg
FROM match
WHERE season = '2011/2012';
| date       | goals | overall_avg       |
|------------|-------|-------------------|
| 2011-07-29 | 3     | 2.71646           |
| 2011-07-30 | 2     | 2.71646           |
| 2011-07-30 | 4     | 2.71646           |
| 2011-07-30 | 1     | 2.71646           |
Datenbearbeitung in SQL

Rangfolge mit RANK erstellen

  • Welchen Rang haben die Spiele nach der Anzahl der geschossenen Tore?
SELECT
    date,
    (home_goal + away_goal) AS goals
FROM match
WHERE season = '2011/2012';
| date       | goals |
|------------|-------|
| 2011-07-29 | 3     |
| 2011-07-30 | 2     |
| 2011-07-30 | 4     |
| 2011-07-30 | 1     |
Datenbearbeitung in SQL

Rangfolge mit RANK erstellen

  • Welchen Rang haben die Spiele nach der Anzahl der geschossenen Tore?
SELECT
    date,
    (home_goal + away_goal) AS goals,
    RANK() OVER(ORDER BY home_goal + away_goal) AS goals_rank
FROM match
WHERE season = '2011/2012';
| date       | goals | goals_rank |
|------------|-------|------------|
| 2012-04-28 | 0     | 1          |
| 2011-12-26 | 0     | 1          |
| 2011-09-10 | 0     | 1          |
| 2011-08-27 | 0     | 1          |
| 2012-01-07 | 0     | 1          |
Datenbearbeitung in SQL

Rangfolge mit RANK erstellen

  • Welchen Rang haben die Spiele nach der Anzahl der geschossenen Tore?
SELECT
    date,
    (home_goal + away_goal) AS goals,
    RANK() OVER(ORDER BY home_goal + away_goal DESC) AS goals_rank
FROM match
WHERE season = '2011/2012';
| date       | goals | goals_rank |
|------------|-------|------------|
| 2011-11-06 | 10    | 1          |
| 2011-08-28 | 10    | 1          |
| 2012-05-12 | 9     | 3          |
| 2012-02-12 | 9     | 3          |
| 2012-03-09 | 9     | 3          |
Datenbearbeitung in SQL

Wichtige Unterschiede

  • Wird nach jedem Teil der Abfrage verarbeitet, ausgenommen ORDER BY
    • Nutzt Infos aus dem Ergebnissatz statt aus der Datenbank
  • Verfügbar in PostgreSQL, Oracle, MySQL, SQL Server...
    • ...aber NICHT in SQLite
Datenbearbeitung in SQL

Lass uns üben!

Datenbearbeitung in SQL

Preparing Video For Download...