集計関数
を調べる必要があります (最小、最大、カウント、平均)、これは GROUP BY
。日付ベースの集計の場合、 date_trunc
も便利です。
たとえば、これは1日あたりの行数を返します:
SELECT date_trunc('day', date_time) AS day_start,
COUNT(id) AS user_count FROM tb_user
GROUP BY date_trunc('day', date_time);
次に、次のようなものを使用して1日の平均を計算できます( 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
を参照) ドキュメント)。
編集: (次のコメント:2012年5月1日までの平均、つまり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: 編集後、あなたが求めているのは、月/週/日ごとのグループではなく、データベースが存在する全期間の単一のグローバル平均にすぎないと思います。
これにより、1日あたりの平均行数がわかります:
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
そうは言っても、そのような統計から導き出す結論は、特にそれがどのように変化するかを見たい場合は、あまり良くないかもしれません。
また、1か月に30日を想定するのではなく、1日あたりのデータを正規化します(すべての日が24時間であるとは限らないため、1時間あたりではない場合 )。 2011年1月に1日あたり10回、2011年2月に1日あたり10回の訪問があるとします。これにより、1月に310回、2月に280回の訪問が発生します。訪問者数が10%減少したため、2月に問題が発生しましたが、実際にはそうではありません。