保留查询-在LEFT JOIN

时间:2019-02-20 23:53:47

标签: sql sql-server retention

我创建了一个保留查询,该查询在尝试查找从第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上。

样本数据和所需结果。

newusers表:

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

1 个答案:

答案 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(这意味着“在列表中有一个匹配的行”)。