0

我创建了一个保留查询,该查询在尝试找出从第 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 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 天之间登录的用户数量。

4

1 回答 1

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你可以从切换LEFTINNER加入(这意味着“在列表一个匹配的行”)。

于 2019-02-21T05:13:07.743 回答