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.