PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL - Obtenir des données statistiques

Vous devriez examiner les fonctions d'agrégation (min, max, count, avg), qui vont de pair avec GROUP BY . Pour les agrégations basées sur la date, date_trunc est également utile.

Par exemple, cela renverra le nombre de lignes par jour :

SELECT date_trunc('day', date_time) AS day_start,
       COUNT(id) AS user_count FROM tb_user
    GROUP BY date_trunc('day', date_time);

Vous pouvez ensuite faire la moyenne quotidienne en utilisant quelque chose comme ça (avec un 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;

Utilisez 'week' au lieu du jour pour les décomptes hebdomadaires, et ainsi de suite (voir date_trunc documentation).

MODIF : (Commentaire suivant :moyenne jusqu'au 01/05/2012 inclus, c'est-à-dire avant le 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;

Ce qui est ci-dessus est trop compliqué, dans ce cas. Cela devrait vous donner le même résultat :

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');

MODIFICATION 2 : Après votre modification, je suppose que ce que vous recherchez est juste une moyenne globale unique pour toute la période d'existence de votre base de données, plutôt que des groupes par mois/semaine/jour.

Cela devrait vous donner le nombre moyen de lignes par jour :

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

(Je remplacerais last_date_time avec NOW() pour faire la moyenne sur la durée jusqu'à maintenant, plutôt que jusqu'à la dernière visite, s'il n'y a pas de visite récente.)

Ensuite, pour les quotidiens, hebdomadaires et "mensuels" :

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

Cela étant dit, les conclusions que vous tirez de ces statistiques peuvent ne pas être excellentes, surtout si vous voulez voir comment cela change.

Je normaliserais également les données par jour plutôt que de supposer 30 jours dans un mois (sinon par heure, car tous les jours n'ont pas 24 heures ). Disons que vous avez 10 visites par jour en janvier 2011 et 10 visites par jour en février 2011. Cela vous donne 310 visites en janvier et 280 visites en février. Si vous ne faites pas attention, vous pourriez penser que vous avez eu presque un Baisse de 10 % en termes de nombre de visiteurs, donc quelque chose s'est mal passé en février, alors que ce n'est vraiment pas le cas.