基于移动日期窗口的SQL条件求和查询

基于移动日期窗口的SQL条件求和查询,sql,postgresql,case,Sql,Postgresql,Case,我正试图找出一些关于我的用户的滑动窗口统计数据。我有一个包含用户的表,以及诸如created_at和verified_at之类的列。每个月,我都想知道有多少用户注册了(一个简单的按创建日期分组的用户),然后在这些用户中,有多少人在我的滑动窗口中进行了验证(称之为60天) 我想执行一个SQL查询,该查询将提供以下内容: Month | Registered | Verified in 60 days Jan 2009 | 1543 | 107 Feb 2009 | 2000

我正试图找出一些关于我的用户的滑动窗口统计数据。我有一个包含用户的表,以及诸如created_at和verified_at之类的列。每个月,我都想知道有多少用户注册了(一个简单的按创建日期分组的用户),然后在这些用户中,有多少人在我的滑动窗口中进行了验证(称之为60天)

我想执行一个SQL查询,该查询将提供以下内容:

Month    | Registered | Verified in 60 days
Jan 2009 | 1543       | 107
Feb 2009 | 2000       | 250
我正在使用postgresql。我开始看sum(case…),但我不知道我是否能让我的案例以某种方式依赖于日期

当然,这不起作用,但有个想法:

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)
选择日期(“月”,创建时间)作为月份,
已注册的计数(*),
验证的总和(在<月+60时验证的情况下,则为1,否则为0)
来自用户
按日期分组(“月”,创建时间)

也许你可以把不同的月份合并在一起

select sum(whatever), 'january' from user where month = 'january'
union all
select sum(whatever), 'february' from user where month = 'february'
...
选择已注册的计数(创建时),
总和(在验证时的情况下_at='2009-01-01'::datetime+(s | |'month')::间隔
并在<'2009-01-01':datetime+(s+1 | |'month')::interval创建了_
分组
s
选择
月,
已注册的计数(*),
求和(当datediff(day,reg_date,ver_date)<60,则为1,否则为0),如“60//days中验证datediff是一个MSSQL函数,适用于postgresql”
从…起
桌子
分组
月

您使用哪个版本的PostgreSQL?关键是我不想在SQL查询中列出月份,因为我不知道有多少个月。这是一个每天都会运行的查询,持续数月(或数年!)随着新数据的到来。这真是太棒了。我最后省略了这个系列,只是在上面的代码中使用了你的时间间隔,效果很好。
@teich
:这个系列确保在任何一个月都没有用户的情况下不会留下任何空白。
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
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