留存查询 - 计算 LEFT JOIN 中具有 BETWEEN 条件的用户

Retention Query - Counting Users with BETWEEN Condition in LEFT JOIN

我创建了一个留存查询,它在尝试找出有多少从第 0 天到第 7 天(或任何其他特定的未来日期)登录的唯一用户时有效。

但是,问题是现在我正在尝试查看从第 0 天到第 7 天(或任何其他未来日期范围)有多少用户登录。

这是当前运行但未产生任何结果的查询:

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

我似乎无法理解为什么这不起作用。在 JOINS 上使用 BETWEEN 条件是否被认为是不好的做法?这是在 SQL 服务器上。

样本数据和期望的结果。

新用户 table:

NewUser - FirstTime
A - 2/1/2019
B - 2/1/2019
C - 2/1/2019
D - 2/2/2019

登录 table:

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 天之间登录的用户数量。

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)

固定日期连接谓词。您可以从 LEFT 切换到 INNER 加入(这意味着 "at list one matching row")而不是 HAVING count(distinct l.UserID) as retaineduser > 0