Anda harus melihat fungsi gabungan
(min, max, count, avg), yang berjalan seiring dengan GROUP BY
. Untuk agregasi berbasis tanggal, date_trunc
juga berguna.
Misalnya, ini akan mengembalikan jumlah baris per hari:
SELECT date_trunc('day', date_time) AS day_start,
COUNT(id) AS user_count FROM tb_user
GROUP BY date_trunc('day', date_time);
Anda kemudian dapat melakukan rata-rata harian menggunakan sesuatu seperti ini (dengan 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;
Gunakan 'week'
bukannya hari untuk hitungan mingguan, dan seterusnya (lihat date_trunc
dokumentasi).
EDIT: (Komentar berikut:rata-rata hingga dan termasuk 1/5/2012, yaitu sebelum tanggal 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;
Apa di atas terlalu rumit, dalam hal ini. Ini akan memberi Anda hasil yang sama:
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');
EDIT 2: Setelah Anda mengedit, saya kira apa yang Anda cari hanyalah rata-rata global tunggal untuk seluruh periode keberadaan database Anda, bukan kelompok berdasarkan bulan/minggu/hari.
Ini akan memberi Anda jumlah rata-rata baris per hari:
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
(Saya akan mengganti last_date_time
dengan NOW()
untuk membuat rata-rata dari waktu ke waktu sampai sekarang, daripada sampai kunjungan terakhir, jika tidak ada kunjungan terakhir.)
Lalu, untuk harian, mingguan, dan "bulanan":
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
Meskipun demikian, kesimpulan yang Anda ambil dari statistik tersebut mungkin tidak terlalu bagus, terutama jika Anda ingin melihat bagaimana perubahannya.
Saya juga akan menormalkan data per hari daripada mengasumsikan 30 hari dalam sebulan (jika tidak per jam, karena tidak semua hari memiliki 24 jam ). Katakanlah Anda memiliki 10 kunjungan per hari di Jan 2011 dan 10 kunjungan per hari di Feb 2011. Itu memberi Anda 310 kunjungan di Jan dan 280 kunjungan di Feb. Jika Anda tidak memperhatikan, Anda bisa berpikir Anda sudah hampir Penurunan 10% dalam hal jumlah pengunjung, jadi ada yang tidak beres di bulan Februari, padahal sebenarnya tidak demikian.