Как я могу вернуть количество разных пользовательских логинов за 30-дневный период для любого данного дня? - PullRequest
0 голосов
/ 07 ноября 2018

Допустим, у меня есть следующий набор данных в таблице с именем UserEvents:

  LogIn     UserID
2018-09-30    1
2018-09-30    3
2018-10-01    1
2018-10-01    2
2018-10-01    3
2018-10-02    2
2018-10-02    3

За каждый день я хотел бы возвращать количество пользователей, вошедших в систему за последний месяц. Вот ожидаемые результаты для выше:

Day        PastMonthUsers
2018-09-30      2
2018-10-01      3
2018-10-02      3

Вот что я пробовал:

Select 
  UserEvents1.LogIn as Day, 
  count (distinct UserEvents1.UserID) as PastMonthUsers
from UserEvents as UserEvents1
inner join 
  (
    Select 
      LogIn,
      UserID
    from UserEvents
  ) as UserEvents2 
on UserEvents2.LogIn between DATE_SUB(UserEvents1.LogIn, interval 1 month) and UserEvents1.LogIn 
group UserEvents1.Day

Вышеупомянутый запрос выполнялся в течение 20 минут для моего фактического набора данных, прежде чем я отменил его. Любые мысли о том, как я могу упростить?

1 Ответ

0 голосов
/ 07 ноября 2018

Ниже для BigQuery Standard SQL и избегает самостоятельного присоединения в пользу использования аналитической функции - но все же может стать проблемой, зависит от ваших данных - попробуйте и дайте нам знать

#standardSQL
SELECT DISTINCT Day, 
  (SELECT COUNT(DISTINCT user) FROM UNNEST(users) user) PastMonthUsers
FROM (
  SELECT Day, 
    ARRAY_AGG(UserID) OVER(ORDER BY days RANGE BETWEEN 29 PRECEDING AND CURRENT ROW) users
  FROM (
    SELECT LogIn Day, UserID, UNIX_DATE(LogIn) days
    FROM `project.dataset.UserEvents`
  )
)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...