In PostgreSQL is de AVG()
functie berekent het gemiddelde (rekenkundig gemiddelde) van alle niet-null invoerwaarden en retourneert het resultaat.
Voorbeeld
Hier is een snel voorbeeld om te laten zien hoe het werkt:
SELECT AVG(amount)
FROM payment;
Resultaat:
4.2006673312979002
In dit geval amount
is een kolom in de payment
tafel.
Om dit wat meer context te geven, is hier een momentopname van de tabel (van de pagila
voorbeelddatabase):
+------------+-------------+----------+-----------+--------+----------------------------+ | 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 | ...
We kunnen het amount
zien kolom waarvoor we het gemiddelde hebben berekend.
De tabel bevat veel meer rijen, maar dit toont u een voorbeeld van de waarden.
Gefilterde resultaten
De AVG()
functie werkt op de rijen die door de query worden geretourneerd. Dus als u de resultaten filtert, wordt het resultaat van AVG()
zal dat weerspiegelen.
Laten we de resultaten filteren:
SELECT AVG(amount)
FROM payment
WHERE customer_id = 271;
Resultaat:
3.8233333333333333
Dus deze keer kregen we het gemiddelde van alle bedragen betaald door klant 271.
De DISTINCT
Zoekwoord
U kunt de DISTINCT
. gebruiken zoekwoord met AVG()
om alleen verschillende waarden te berekenen. Dat wil zeggen, als er dubbele waarden zijn, worden deze als één waarde behandeld.
Voorbeeld:
SELECT
AVG(amount) AS "All",
AVG(DISTINCT amount) AS "Distinct"
FROM payment;
Resultaat:
+--------------------+--------------------+ | All | Distinct | +--------------------+--------------------+ | 4.2006673312979002 | 6.1447368421052632 | +--------------------+--------------------+
In dit geval is er een zeer groot verschil tussen de verschillende en niet-onderscheiden resultaten. Dit suggereert dat er veel dubbele waarden in die kolom staan.
Om dit te verifiëren, kunnen we de verschillende waarden als volgt uitvoeren:
SELECT DISTINCT amount
FROM payment;
Resultaat:
+--------+ | 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)
Dus ons voorbeeld retourneerde het gemiddelde van die verschillende waarden.