加入日期范围PostgreSQL的最佳方式

时间:2017-06-27 21:15:57

标签: postgresql

此Periscope数据博客文章介绍了如何使用下面的SQL查询来查找本月访问过您网站的用户数量,即上个月,即"保留":

with monthly_activity as (
  select distinct
    date_trunc('month', created_at) as month,
    user_id
  from events
)
select
  this_month.month,
  count(distinct user_id)
from monthly_activity this_month
join monthly_activity last_month
  on this_month.user_id = last_month.user_id
  and this_month.month = last_month.month + interval '1 month' -- date join
group by month

但是如果将保留定义为上个月没有访问过"那该怎么办?但是"过去任何一个月都访问了 "?

在这种情况下,我们希望日期加入(在上述查询中突出显示为注释)不仅仅是过去的1个月,而是过去的所有个月。

即。像这样的东西,但没有硬编码:

  and this_month.month = last_month.month + interval '1 month' 
  and this_month.month = last_month.month + interval '2 month' 
  and this_month.month = last_month.month + interval '3 month' 
  ...

我很难知道最好的方法是什么。

我尝试了以下变通方法,但我认为它们会导致奇怪的笛卡尔产品,因为我的查询还没有运行:

AND current_month.month > past_logs.month -- doesn't run

AND past_logs.month IN (select i::date from generate_series('2014-10-01', 
                        current_month.month, '1 month'::interval) i) -- doesn't run

关于最佳方法的想法?

0 个答案:

没有答案