Запрос на сохранение - подсчет пользователей с условием МЕЖДУ в LEFT JOIN
Я создал запрос на сохранение, который работает, когда я пытаюсь выяснить, сколько уникальных пользователей со дня 0 вошли в систему в день 7 (или любую другую конкретную дату в будущем).
Однако проблема в том, что теперь я пытаюсь увидеть, сколько пользователей с 0-го дня вошли в систему с 1-го по 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
Кажется, я не могу понять, почему это не работает. Считается ли использование условия BETWEEN плохой практикой в JOINS? Это на 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.
1 ответ
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
объединение (что означает "в списке один совпадающий ряд").