我创建了一个保留查询,该查询在尝试查找从第0天(第7天)(或将来的其他任何特定日期)登录的第0天起有多少唯一用户时有效。
但是,问题在于,现在我正在尝试查看从第1天到第7天(或任何其他将来的日期范围)从0天开始登录的用户。
以下是当前正在运行的查询,但未产生任何结果:
select FirstTime, count(distinct(newusers)) as NewUsers, FutureDate
, count(distinct(retaineduser)) as RetainedUser
from
(
select nu.UserID as newusers, firsttime, l.UserID as retaineduser, l.LoginDate as FutureDate
from ##newusers nu
left join ##logins l on nu.UserID = l.UserID
and FirstTime between dateadd(dd, -1, l.logindate) and dateadd(dd, -7, l.logindate)
group by nu.UserID, FirstTime, l.UserID, l.logindate
) as x
group by FirstTime, futuredate
HAVING count(retaineduser) > 0
我似乎无法确定为什么这种方法无效。在联接上使用BETWEEN条件是否被视为不良做法?这是在SQL Server上。
样本数据和所需结果。
NewUser - FirstTime
A - 2/1/2019
B - 2/1/2019
C - 2/1/2019
D - 2/2/2019
RetainedUser - LoginDate
A - 2/1/2019
A - 2/3/2019
A - 2/4/2019
B - 2/1/2019
B - 2/6/2019
C - 2/1/2019
C - 2/10/2019
D - 2/2/2019
D - 2/3/2019
FirstTime - NewUsers - FutureDate - RetainedUser
2/1/2019 - 3 - 2/8/2019 - 2
2/2/2019 - 1 - 2/9/2019 - 1
因此,所需的结果将具有第一个日期和之后登录的新用户数量。以及未来的日期(即未来的7天)以及在第1天到第7天之间登录的用户数。
答案 0 :(得分:0)
select nu.FirstTime,
count(distinct nu.UserID) as newusers,
dateadd(dd, 7, l.FirstTime),
count(distinct l.UserID) as retaineduser
from ##newusers nu
inner join ##logins l on l.UserID = nu.UserID
and l.logindate between nu.FirstTime and dateadd(dd, 7, nu.FirstTime)
group by nu.FirstTime, dateadd(dd, 7, nu.FirstTime)
固定日期加入谓词。可以从HAVING count(distinct l.UserID) as retaineduser > 0
切换为LEFT
来代替INNER
(这意味着“在列表中有一个匹配的行”)。