PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL - Получаване на статистически данни

Трябва да разгледате агрегирани функции (min, max, count, avg), които вървят ръка за ръка с GROUP BY . За базирани на дата агрегирания, date_trunc също е полезно.

Например, това ще върне броя редове на ден:

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

След това можете да направите средната дневна стойност, като използвате нещо подобно (с 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;

Използвайте 'week' вместо ден за седмичните преброявания и т.н. (вижте date_trunc документация).

РЕДАКТИРАНЕ: (Следващ коментар:средно до и включително 5/1/2012, т.е. преди 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;

Горното в случая е прекалено сложно. Това трябва да ви даде същия резултат:

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

РЕДАКТИРАНЕ 2: След вашата редакция предполагам, че това, което преследвате, е само една обща средна стойност за целия период на съществуване на вашата база данни, а не групи по месец/седмица/ден.

Това трябва да ви даде средния брой редове на ден:

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

(Бих заменил last_date_time с NOW() за да направите средната стойност за времето до момента, а не до последното посещение, ако няма скорошно посещение.)

След това за ежедневни, седмични и "месечни":

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

Като се има предвид това, изводите, които правите от такава статистика, може да не са добри, особено ако искате да видите как се променя.

Също така бих нормализирал данните на ден, вместо да приемам 30 дни в месеца (ако не и на час, защото не всички дни имат 24 часа ). Да кажем, че имате 10 посещения на ден през януари 2011 г. и 10 посещения на ден през февруари 2011 г. Това ви дава 310 посещения през януари и 280 посещения през февруари. Ако не обърнете внимание, може да си помислите, че сте имали почти 10% спад по отношение на броя на посетителите, така че нещо се е объркало през февруари, но всъщност това не е така.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да посочите име на хост във файла pg_hba.conf на postgresql?

  2. Как да изберете няколко реда, запълнени с константи в Amazon Redshift?

  3. Определяне дали транзакцията е активна (Postgres)

  4. Как да използвам case-when в Ecto Queries в elixir?

  5. Начини за прилагане на версии на данни в PostreSQL