Трябва да разгледате агрегирани функции
(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% спад по отношение на броя на посетителите, така че нещо се е объркало през февруари, но всъщност това не е така.