2010-01-11 39 views
16

Tôi đang cố gắng tìm ra một số thống kê cửa sổ trượt trên người dùng của mình. Tôi có một bảng với một người dùng, và các cột như created_at và verified_at. Đối với mỗi tháng, tôi muốn tìm hiểu có bao nhiêu người dùng đã đăng ký (một nhóm đơn giản bởi date_trunc của created_at), và sau đó của những người đó, bao nhiêu xác minh trong cửa sổ trượt của tôi (gọi là 60 ngày).Truy vấn SQL để tổng hợp có điều kiện dựa trên cửa sổ ngày di chuyển

Tôi muốn làm một truy vấn SQL mà mang lại cho tôi một cái gì đó như:

Month | Registered | Verified in 60 days 
Jan 2009 | 1543  | 107 
Feb 2009 | 2000  | 250 

Tôi đang sử dụng postgresql. Tôi bắt đầu xem xét tổng (trường hợp ...), nhưng tôi không biết liệu tôi có thể khiến trường hợp của mình phụ thuộc vào date_trunc bằng cách nào đó không.

này không hoạt động, tất nhiên, nhưng đây là ý tưởng:

SELECT DATE_TRUNC('month', created_at) as month, 
COUNT(*) as registered, 
SUM(CASE WHEN verified_at < month+60 THEN 1 ELSE 0 END) as verified 
FROM users 
GROUP BY DATE_TRUNC('month', created_at) 
+0

Phiên bản nào của PostgreSQL nào bạn sử dụng? –

+0

Tôi đang sử dụng 8.3.5 – teich

Trả lời

21
SELECT COUNT(created_at) AS registered, 
     SUM(CASE WHEN verified_at <= created_at + '60 day'::INTERVAL THEN 1 ELSE 0 END) AS verified 
FROM generate_series(1, 20) s 
LEFT JOIN 
     users 
ON  created_at >= '2009-01-01'::datetime + (s || ' month')::interval 
     AND created_at < '2009-01-01'::datetime + (s + 1 || ' month')::interval 
GROUP BY 
     s 
+0

Thật tuyệt vời. Tôi bị thương để lại ra khỏi bộ truyện, và chỉ sử dụng khoảng thời gian của bạn trong đoạn mã ở trên, hoạt động tuyệt vời. – teich

+0

'@ teich': chuỗi đảm bảo rằng không có khoảng trống nào được để lại nếu không có người dùng nào trong bất kỳ tháng nào. – Quassnoi

0

có lẽ bạn có thể kết hợp cùng những tháng khác nhau.

select sum(whatever), 'january' from user where month = 'january' 
union all 
select sum(whatever), 'february' from user where month = 'february' 
... 
+0

Điều quan trọng là tôi không muốn liệt kê ra các tháng trong truy vấn SQL, vì tôi không biết tôi đã có bao nhiêu tháng. Đây là một truy vấn sẽ chạy mỗi ngày, trong nhiều tháng (hoặc nhiều năm!) Khi dữ liệu mới xuất hiện. – teich

0
SELECT 
    MONTH, 
    COUNT(*) AS Registered, 
    SUM (CASE WHEN datediff(day,reg_date,ver_date) < 60 THEN 1 ELSE 0) as 'Verified in 60 //days datediff is an MSSQL function amend for postgresql' 
FROM 
    TABLE 
GROUP BY 
    MONTH 
Các vấn đề liên quan