3

我有这样的数据:

Date             User ID
2012-10-11         a
2012-10-11         b
2012-10-12         c
2012-10-12         d 
2012-10-13         e
2012-10-14         b
2012-10-14         e

我想要做的是每天按最近的两天范围(在我的实际查询中,它将是 7 天)分组,并获取不同用户 ID 的计数。

例如,我希望结果如下所示:

Date             count(distinct userIDs)
2012-10-12         4
2012-10-13         3
2012-10-14         2

例如,对于 2012-10-12,我的计数为 4,因为我有'a''b''c''d'。' ==> 'a''b'来自前一天,'c''d'来自同一天,2012-10-12。

同样,对于 2012-10-13,我正在查看 2012-10-13 和 2012-10-12,我得到'c''d''e'

日期列的数据类型是日期。我正在使用 Teradata。

我一直在尝试研究它,但还没有找到适用于我情况的直接答案。:-/ 抱歉,如果这是重复的话。非常感谢您的帮助。谢谢!

4

2 回答 2

2

要执行您想要的操作,您实际上需要“乘以”数据,因为每一行都可以包含在两个日期中以进行最终聚合。

我认为最简单的方法是一种union all方法:

select date, count(distinct userId)
from ((select date, UserId
       from t
      ) union all
      (select date + 1, UserId     -- combine with yesterday's data
       from t
      )
     ) t
group by date;

因为您要处理 7 天,所以这是另一种方法:

select (t.date + n), count(distinct t.UserId)
from t cross join
     (select 0 as n union all select 1 union all select 2 union all select 3 union all
      select 4 union all select 5 union all select 6
     ) n
group by t.date + n;
于 2013-05-24T02:41:16.337 回答
2

我对 Teradata 语法并不完全熟悉,所以我将使用 redbrick 向您展示逻辑。

select date, count(distinct userid) records
from yourtable
where date >= dateadd(day, -2, current_date)
group by date
order by date 

编辑从这里开始

经进一步审查,如果您更换

where date >= dateadd(day, -2, current_date)

where date >= current_date - 2

那么你应该好好去。

于 2013-05-23T22:45:18.403 回答