我在90天的窗口中拥有多少个不同的活跃用户?

时间:2016-07-07 23:03:47

标签: sql postgresql amazon-redshift

我有一个复杂的问题,乍一看似乎微不足道:

  • 对于给定的90天窗口,我有多少不同的活跃用户?

我将用于查询的表是登录表(在Redshift中托管),它有一个时间戳,其中包含logintime和usertoken作为用户标识符。

每当我想在一天内回答这个问题时,查询就很简单明了:

select count (distinct usertoken)
from logins
where datediff('d',logintime,getdate()) <= 90

问题变得复杂,因为我希望在每个给定日期的数字表中都有这个。

07/07  100k
07/06  98k
07/05  99k
07/04  101k

(...)

窗口函数对我没有帮助,因为我需要计算不同,这在窗口函数中是不可能的。

据我所知,没有办法迭代SQL查询。

我应该怎么做?

3 个答案:

答案 0 :(得分:0)

琐碎的方式非常昂贵:

select days.d, count(distinct l.userid)
from (select distinct date_trunc('day', logintime) as d
      from logins l
     ) days left join
     (select distinct userid, date_trunc('day', logintime) as d
      from logins
     ) l
     on datediff('d', l.d, days.d) between 0 and 89
group by days.d
order by days.d;

答案 1 :(得分:0)

也许我错过了一些东西,但据我所知,应该这样做:

- 在SQL Server中

  

select cast(logintime As Date),从登录计数(distinct usertoken)   其中datediff(D,logintime,getdate())&lt; = 90分组依据   cast(logintime As Date)

PostGreSQL中的

将强制转换(logintime As Date)更改为trunc_Date(Day,logintime) 和datediff(D,logintime,getdate())到datediff('d',logintime,getdate())

答案 2 :(得分:0)

我假设如果有一天没有用户登录,请不要介意不在列表中显示。

首先,我们会得到一组我们关心的所有日子并称之为#34;天&#34;。

  with days as (
     select date_trunc('day', date) as day from logins
     where date > now() - '90 days'::interval
     group by day 
    )

然后我们加入登录日期。

select day, count(distinct userid)
from days
join  logins on date_trunc('day', logins.date) = days.day
group by day
order by day