PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL - Ottenere dati statistici

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ì.