Вы должны посмотреть на агрегатные функции (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);
Затем можносделать среднесуточное значение, используя что-то вроде этого (с 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;
Используйте '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%, поэтому в феврале что-то пошло не так, хотя на самом деле это не так.