PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL - Mendapatkan data statistik

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pertanyaan postgresql nextval tentang urutan

  2. Bagaimana cara mengubah database_url di heroku?

  3. Buat indeks unik pada kolom yang tidak unik

  4. PostgreSQL SALIN keluaran pipa ke gzip dan kemudian ke STDOUT

  5. klien psql dapat menjadi papan catur sekarang ...