2016-07-07 32 views
5

我有一个复杂的问题,这似乎是一见钟情简单:我在90天的窗口中有多少个不同的活跃用户?

  • 了提供了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查询中迭代。

我应该怎么办?

+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; 
+0

难道你不得不说'介于0到90之间(甚至可能是89)吗?差异可能是负面的。 – shawnt00

0

也许我失去了一些东西,但是从我的理解这应该这样做:

- 在SQL Server

选择投(登录时间作为日期),从登录 计数(distinct usertoken)其中datediff(D,logintime,getdate())< = 90 Group by cast时间作为日期)

在PostgreSQL 变更铸造

(logintime作为日期)至trunc_Date(日,logintime) 和DATEDIFF(d,logintime,GETDATE())来DATEDIFF( 'd',logintime,GETDATE( ))

0

我假设如果一天有零用户登录你不介意不显示它在列表中。

首先我们得到一整套我们关心的日子,并将其设置为“天”。

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