【问题标题】:How many distinct active users did I have on a 90 day window? [duplicate]在 90 天的窗口中,我有多少不同的活跃用户? [复制]
【发布时间】:2016-11-10 10:18:39
【问题描述】:

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

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

我将用来查询这个的表是登录表(托管在 Redshift 中),它有一个时间戳,其中登录时间和用户令牌作为用户标识符。

每当我想在一天内回答这个问题时,查询都很简单直接:

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 查询中进行迭代。

我该怎么办?

【问题讨论】:

  • 请详细说明every given date。您是否通过时间范围的下限和上限?还是一组随机日期?同一天可以有单个用户的重复条目吗?你的桌子有多大?行数?每行/表定义的字节数。

标签: sql postgresql amazon-redshift


【解决方案1】:

简单的方法在计算上非常昂贵:

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;

【讨论】:

  • 你不必说between 0 and 90(甚至可能是89)吗?差异可能是负数。
【解决方案2】:

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

-- 在 SQL Server 中

select cast(logintime As Date) ,从登录中计数(不同的用户令牌) 其中 datediff(D,logintime,getdate())

在 PostGreSQL 中 将 cast(logintime As Date) 更改为 trunc_Date(Day, logintime ) 和 datediff(D,logintime,getdate()) 到 datediff('d',logintime,getdate())

【讨论】:

    【解决方案3】:

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

    首先,我们得到一组我们关心的所有天数,并将其称为“天数”。

      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
    

    【讨论】:

      猜你喜欢
      • 2016-03-13
      • 2018-09-25
      • 1970-01-01
      • 2019-08-30
      • 2012-11-07
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多