PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PostgreSQL - Lấy dữ liệu thống kê

Bạn nên xem xét các hàm tổng hợp (min, max, count, avg) đi đôi với GROUP BY . Đối với tổng hợp dựa trên ngày, date_trunc cũng hữu ích.

Ví dụ:điều này sẽ trả về số hàng mỗi ngày:

SELECT date_trunc('day', date_time) AS day_start,
       COUNT(id) AS user_count FROM tb_user
    GROUP BY date_trunc('day', date_time);

Sau đó, bạn có thể thực hiện mức trung bình hàng ngày bằng cách sử dụng một cái gì đó như thế này (với một 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;

Sử dụng 'week' thay vì ngày cho tổng số hàng tuần, v.v. (xem date_trunc tài liệu).

CHỈNH SỬA: (Nhận xét sau:trung bình đến và bao gồm 5/1/2012, tức là trước ngày 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;

Những gì ở trên là quá phức tạp, trong trường hợp này. Điều này sẽ cho bạn kết quả tương tự:

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');

CHỈNH SỬA 2: Sau khi bạn chỉnh sửa, tôi đoán những gì bạn đang theo dõi chỉ là một mức trung bình toàn cầu duy nhất cho toàn bộ thời gian tồn tại của cơ sở dữ liệu của bạn, thay vì nhóm theo tháng / tuần / ngày.

Điều này sẽ cung cấp cho bạn số hàng trung bình mỗi ngày:

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

(Tôi sẽ thay thế last_date_time với NOW() để tạo mức trung bình theo thời gian cho đến bây giờ, thay vì cho đến lần truy cập cuối cùng, nếu không có lượt truy cập gần đây.)

Sau đó, hàng ngày, hàng tuần và "hàng tháng":

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

Điều này đang được nói, kết luận bạn rút ra từ số liệu thống kê như vậy có thể không tuyệt vời, đặc biệt nếu bạn muốn xem nó thay đổi như thế nào.

Tôi cũng sẽ chuẩn hóa dữ liệu mỗi ngày thay vì giả định là 30 ngày trong một tháng (nếu không phải mỗi giờ, vì không phải tất cả các ngày đều có 24 giờ ). Giả sử bạn có 10 lượt truy cập mỗi ngày vào tháng 1 năm 2011 và 10 lượt truy cập mỗi ngày vào tháng 2 năm 2011. Điều đó mang lại cho bạn 310 lượt truy cập vào tháng 1 và 280 lượt truy cập vào tháng 2. Nếu không chú ý, bạn có thể nghĩ rằng mình đã gần như Giảm 10% về số lượng khách truy cập, vì vậy đã xảy ra sự cố vào tháng 2, trong khi thực sự, đây không phải là trường hợp.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. lỗi postgresql:hủy tuyên bố do yêu cầu của người dùng

  2. Làm cách nào để xóa tất cả các khoảng trắng khỏi một trường trong cơ sở dữ liệu Postgres trong một truy vấn cập nhật?

  3. ràng buộc duy nhất về kiểu dữ liệu Bytea trên Postgresql

  4. Dấu hai chấm (::) ký hiệu trong SQL

  5. Cách khởi động Máy chủ PostgreSQL trên Mac OS X qua Homebrew