我需要获得一份报告,每周显示不同的用户以显示每周的用户增长情况,但我需要它来显示累积的不同用户。
因此,如果我有5周的数据,我想显示: 从第0周到第1周的不同用户 从第0周到第2周的不同用户 从第0周到第3周的不同用户 从第0周到第4周的不同用户 从第0周到第5周的不同用户
我有一整年的数据。我知道如何做到这一点的唯一方法是逐字查询一周调整一周的时间范围,这非常繁琐。我无法弄清楚如何查询从第0周到第1周一直到第0周到第52周的所有内容。
编辑 - 到目前为止我所拥有的:
select count(distinct user_id) as count
from tracking
where datepart(wk,login_dt_tm) >= 0 and datepart(wk,login_dt_tm) <= 1
然后我取出那个号码,记录下来,并将其更新为 - datepart(wk,login_dt_tm)&lt; = 2.依此类推,直到我有了所有的周。这样我就可以按周制定一张不错的增长图表。
这很乏味,必须采用另一种方式。
更新 - 我使用了@siyual提供的解决方案,但更新了它以使用表变量,所以我可以在一个输出中得到所有结果。
Declare @Week Int = 0
Declare @Totals Table
(
WeekNum int,
UserCount int
)
While @Week < 52
Begin
insert into @Totals (WeekNum,UserCount)
select @Week,count(distinct user_id) as count
from tracking
where datepart(wk,login_dt_tm) >= @Week and datepart(wk,login_dt_tm) <= (@Week + 1)
Set @Week += 1
End
Select * from @Totals
答案 0 :(得分:2)
为什么不能这样:
select count(distinct user_id) as count, datepartk(wk, login_dt_tm) as week
from tracking
group by datepart(wk,login_dt_tm)
order by week
答案 1 :(得分:1)
您可以尝试这样的事情:
Declare @Week Int = 1
While @Week <= 52
Begin
select count(distinct user_id) as count
from tracking
where datepart(wk,login_dt_tm) >= 0 and datepart(wk,login_dt_tm) <= @Week
Set @Week += 1
End
答案 2 :(得分:1)
只是为了记录,我会在一个语句中执行此操作,使用递归CTE生成从1到52的数字(您也可以使用数字表):
with numbers as (
select 1 as n
union all
select n + 1
from numbers
where n < 52
)
select count(distinct user_id) as count
from tracking t join
numbers n
on datepart(wk, login_dt_tm) >= 0 and datepart(wk, login_dt_tm) <= numbers.n;
似乎更容易将它全部放在一个查询中。
答案 3 :(得分:1)
SELECT
week_num,
distinct_count
FROM (
select distinct
datepart(wk,login_dt_tm) week_num
from @tracking
) t_week
CROSS APPLY (
select
count(distinct user_id) distinct_count
from @tracking
where datepart(wk,login_dt_tm) between 0 and t_week.week_num
) t_count