Lär dig SQL

Back to All Courses

Lesson 9

Aggregator-funktioner

by Ted Klein Bergman

Aggregator funktion

Aggregator funktioner är funktioner som agerar på grupper av värden. Några exempel är:

  • MIN : returnerar det minsta värdet i gruppen.

  • MAX : returnerar det största värdet i gruppen.

  • SUM : returnerar summan av alla värden i gruppen.

  • AVG : returnerar medelvärdet av värdena i gruppen.

  • COUNT : returnerar antalet element i gruppen.

Något viktigt att notera är att alla dessa funktioner ignorerar värdet NULL. Det bidrar inte till en summa eller medelvärde, det kan inte vara maxvärdet eller minvärdet, och det räknas inte som ett element.

I det simplaste fallet kan vi använda någon av dessa funktioner i våran SELECT sats. Exempelvis kan vi använda funktionen MAX på attributet age för att hitta åldern på den äldsta användaren.

SELECT MAX(age) AS highest_age        -- Ger resultatet aliasen highest_age.
FROM users;

Queryn kommer ge tillbaka det högsta värdet av alla attribut age i tabellen Users. Vi skulle kunna använda funktionen COUNT för att räkna antalet användare i tabellen Users.

SELECT COUNT(user_id) 
FROM users;

Det finns ett specialfall med funktionen COUNT, nämligen COUNT(*) som räknar hur många tuples som finns i tabellen. I vårat fall är COUNT(user_id) och COUNT(*) detsamma, eftersom user_id är en PRIMARY KEY och måste finnas i alla tuples. Dock kan COUNT(age) och COUNT(*) skilja sig om det finns en eller fler användare som inte har angett sin ålder (d.v.s. deras ålder är NULL).

GROUP BY

Istället för att köra funktionerna på hela tabellen så kan vi dela in våran tabell i grupper, baserat på något attribut, innan vi använder oss av dessa funktioner. Säg att vi vill räkna antalet tweets våra användare har postat. Det vi gör då är att gruppera vår tabell tweets utefter postaren, och sedan räknar antalet tuples i den gruppen.

SELECT poster_id, COUNT(*) AS number_of_tweets
FROM tweets
GROUP BY poster_id;

Ett sätt att visualisera detta på är att vi skapar en låda för varje unikt poster_id och skriver det värdet på lådans etikett. Sedan går vi igenom alla tuples och stoppar tuples som har poster_id = 1 i den låda som är markerad 1, tuples som har poster_id = 2 i den låda som är markerad 2, 0ch så vidare. Till sist applicerar vi funktionen COUNT på varje låda och får ut hur många tweets varje användare har postat.

Ett annat exempel kan vara att ta reda på vilken den första tweeten en användare postade. Det vi måste göra då är att gruppera alla tweets på postaren och sedan köra MIN på datumet de postades (det kommer returnera det lägsta datumet, d.v.s. det tidigaste datumet).

SELECT poster_id, MIN(time_posted) AS time_of_first_tweet
FROM tweets
GROUP BY poster_id;

Återigen stoppar vi bara alla tuples med ett visst poster_id i en låda, och sedan tittar efter den tuple som har det lägsta datumet.

Ett annat exempel kan vara antalet tweets en användare postat, samt deras användarnamn.

SELECT username, COUNT(*) AS number_of_posts
FROM tweets JOIN users ON poster_id = user_id
GROUP BY username;

Viktigt att notera är att om attributet vi grupperar på kan vara NULL, så kommer NULL att bidra till en egen grupp.

HAVING

Ibland vill vi bara inkludera vissa grupper som har en viss egenskap. HAVING är ett sätt för oss att sålla bort grupper som inte stämmer in på något villkor. Det är väldigt likt WHERE, förutom att WHERE sållar bort tuples.

I de exempel ovan grupperade vi tweets utefter användare. Något som kan vara kul att veta kan vara vilka av dessa användare som har mer än 5 tweets.

SELECT username
FROM tweets JOIN users ON poster_id = user_id
GROUP BY username
HAVING COUNT(tweet_id) > 5;

Det vi gör i detta exempel är att sålla bort de grupper ("lådor") som inte har mer än 10 tweets.

Vi kan med hjälp av detta lista ut vilka som slutade tweetade efter det datum som jorden gick under. Allt vi behöver titta efter är de användare vars senaste tweet var innan 2012-12-21.

SELECT username
FROM users JOIN tweets ON user_id = poster_id
GROUP BY username
HAVING MAX(time_posted) < '2012-12-21';