Dovresti esaminare le funzioni aggregate
(min, max, count, avg), che vanno di pari passo con GROUP BY
. Per le aggregazioni basate sulla data, date_trunc
è anche utile.
Ad esempio, questo restituirà il numero di righe al giorno:
SELECT date_trunc('day', date_time) AS day_start,
COUNT(id) AS user_count FROM tb_user
GROUP BY date_trunc('day', date_time);
Puoi quindi fare la media giornaliera usando qualcosa del genere (con a CTE ):
WITH daily_count AS (SELECT date_trunc('day', date_time) AS day_start,
COUNT(id) AS user_count FROM tb_user
GROUP BY date_trunc('day', date_time))
SELECT AVG(user_count) FROM daily_count;
Usa 'week'
invece del giorno per i conteggi settimanali e così via (vedi date_trunc
documentazione).
MODIFICA: (Commento successivo:media fino al 1/5/2012 incluso, ovvero prima del 6.)
WITH daily_count AS (SELECT date_trunc('day', date_time) AS day_start,
COUNT(id) AS user_count
FROM tb_user
WHERE date_time >= DATE('2012-01-01') AND date_time < DATE('2012-01-06')
GROUP BY date_trunc('day', date_time))
SELECT SUM(user_count)/(DATE('2012-01-06') - DATE('2012-01-01')) FROM daily_count;
Ciò che è sopra è eccessivamente complicato, in questo caso. Questo dovrebbe darti lo stesso risultato:
SELECT COUNT(id)/(DATE('2012-01-06') - DATE('2012-01-01'))
FROM tb_user
WHERE date_time >= DATE('2012-01-01') AND date_time < DATE('2012-01-06');
EDIT 2: Dopo la tua modifica, immagino che tu stia cercando solo una singola media globale per l'intero periodo di esistenza del tuo database, piuttosto che gruppi per mese/settimana/giorno.
Questo dovrebbe darti il numero medio di righe al giorno:
WITH total_min_max AS (SELECT
COUNT(id) AS total_visits,
MIN(date_time) AS first_date_time,
MAX(date_time) AS last_date_time,
FROM tb_user)
SELECT total_visits/((last_date_time::date-first_date_time::date)+1) AS users_per_day
FROM total_min_max
(Sostituirei last_date_time
con NOW()
per fare la media nel tempo fino ad ora, anziché fino all'ultima visita, se non c'è una visita recente.)
Quindi, per giornaliero, settimanale e "mensile":
WITH daily_avg AS (
WITH total_min_max AS (SELECT
COUNT(id) AS total_visits,
MIN(date_time) AS first_date_time,
MAX(date_time) AS last_date_time,
FROM tb_user)
SELECT total_visits/((last_date_time::date-first_date_time::date)+1) AS users_per_day
FROM total_min_max)
SELECT
users_per_day,
(users_per_day * 7) AS users_per_week,
(users_per_month * 30) AS users_per_month
FROM daily_avg
Detto questo, le conclusioni che trai da tali statistiche potrebbero non essere eccezionali, soprattutto se vuoi vedere come cambia.
Normalizzerei anche i dati al giorno piuttosto che assumere 30 giorni in un mese (se non all'ora, perché non tutti i giorni hanno 24 ore ). Supponiamo di avere 10 visite al giorno a gennaio 2011 e 10 visite al giorno a febbraio 2011. Questo ti dà 310 visite a gennaio e 280 visite a febbraio. Se non presti attenzione, potresti pensare di aver avuto quasi un 10% di calo in termini di numero di visitatori, quindi qualcosa è andato storto a febbraio, quando in realtà non è così.