I PostgreSQL er AVG()
funktion beregner gennemsnittet (aritmetisk middelværdi) af alle inputværdier, der ikke er nul, og returnerer resultatet.
Eksempel
Her er et hurtigt eksempel for at demonstrere, hvordan det virker:
SELECT AVG(amount)
FROM payment;
Resultat:
4.2006673312979002
I dette tilfælde amount
er en kolonne i payment
bord.
For at give dette lidt mere kontekst, er her et øjebliksbillede af tabellen (fra pagila
eksempeldatabase):
+------------+-------------+----------+-----------+--------+----------------------------+ | payment_id | customer_id | staff_id | rental_id | amount | payment_date | +------------+-------------+----------+-----------+--------+----------------------------+ | 16050 | 269 | 2 | 7 | 1.99 | 2017-01-24 21:40:19.996577 | | 16051 | 269 | 1 | 98 | 0.99 | 2017-01-25 15:16:50.996577 | | 16052 | 269 | 2 | 678 | 6.99 | 2017-01-28 21:44:14.996577 | | 16053 | 269 | 2 | 703 | 0.99 | 2017-01-29 00:58:02.996577 | | 16054 | 269 | 1 | 750 | 4.99 | 2017-01-29 08:10:06.996577 | | 16055 | 269 | 2 | 1099 | 2.99 | 2017-01-31 12:23:14.996577 | | 16056 | 270 | 1 | 193 | 1.99 | 2017-01-26 05:10:14.996577 | | 16057 | 270 | 1 | 1040 | 4.99 | 2017-01-31 04:03:42.996577 | | 16058 | 271 | 1 | 1096 | 8.99 | 2017-01-31 11:59:15.996577 | ...
Vi kan se amount
kolonne, som vi beregnede gennemsnittet for.
Tabellen indeholder mange flere rækker, men dette viser dig et eksempel på værdierne.
Filtrerede resultater
AVG()
funktionen fungerer på de rækker, der returneres af forespørgslen. Så hvis du filtrerer resultaterne, vil resultatet af AVG()
vil afspejle det.
Lad os filtrere resultaterne:
SELECT AVG(amount)
FROM payment
WHERE customer_id = 271;
Resultat:
3.8233333333333333
Så denne gang fik vi gennemsnittet af alle beløb betalt af kunde 271.
DISTINCT
Søgeord
Du kan bruge DISTINCT
søgeord med AVG()
kun at beregne distinkte værdier. Det vil sige, at hvis der er nogen duplikerede værdier, behandles de som én værdi.
Eksempel:
SELECT
AVG(amount) AS "All",
AVG(DISTINCT amount) AS "Distinct"
FROM payment;
Resultat:
+--------------------+--------------------+ | All | Distinct | +--------------------+--------------------+ | 4.2006673312979002 | 6.1447368421052632 | +--------------------+--------------------+
I dette tilfælde er der en meget stor forskel mellem de distinkte og ikke-distinkte resultater. Dette tyder på, at der er mange duplikerede værdier i den kolonne.
For at bekræfte dette kan vi udlæse de forskellige værdier som dette:
SELECT DISTINCT amount
FROM payment;
Resultat:
+--------+ | amount | +--------+ | 1.99 | | 3.98 | | 7.99 | | 5.99 | | 10.99 | | 2.99 | | 8.97 | | 8.99 | | 3.99 | | 9.98 | | 11.99 | | 7.98 | | 6.99 | | 0.00 | | 4.99 | | 5.98 | | 0.99 | | 1.98 | | 9.99 | +--------+ (19 rows)
Så vores eksempel returnerede gennemsnittet af disse forskellige værdier.