2010-01-11 18 views
16

我想弄清楚我的用户滑动窗口统计信息。我有一个用户的表,以及像created_at和verified_at这样的列。对于每个月,我想知道有多少用户注册了(由created_at的date_trunc组成的一个简单组),然后是那些人,在我的滑动窗口中验证了多少用户(称为60天)。基于移动日期窗口有条件地求和SQL查询

我想要做一个SQL查询,让我这样的:

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

我使用PostgreSQL。我开始看sum(case ...),但我不知道是否可以让我的案例以某种方式依赖于date_trunc。

这是不行的,当然,但这里的想法:

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

你使用哪种版本的PostgreSQL? – 2010-01-11 22:39:52

+0

我正在使用8.3.5 – teich 2010-01-11 22:42:34

回答

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

太棒了。我最终放弃了这个系列,只是在上面的代码中使用了你的时间间隔,这很好。 – teich 2010-01-11 22:54:34

+0

'@ teich':该系列文章确保在任何月份没有用户的情况下不会留下空隙。 – Quassnoi 2010-01-11 22:56:32

0

也许你可以一起联合不同的月份。

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

关键是我不想在SQL查询中列出几个月,因为我不知道我有多少个月。这是一个每天都会运行的查询,几个月(或几年!)随着新数据的进入。 – teich 2010-01-11 22:43:18

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