Как рассчитывать отдельных пользователей в 28-дневном скользящем окне - SQL Hive - PullRequest
1 голос
/ 15 мая 2019

Я пытаюсь подсчитать, сколько разных пользователей используют приложение за 28-дневное время. Например, если я стою на feb-28, я хочу знать, сколько разных пользователей вошли в приложение. Хитрость в том, что я хочу считать их только один раз Следовательно, если пользователь «22» вошел в систему 28 раз, я хочу, чтобы он считал только один.

Кроме того, пользователь может появляться только один раз за дату.

select b.date, count(DISTINCT a.id)
from table a,
 (SELECT distinct(date), date_sub(date,27) dt_start
  from table) b
where a.date >= b.dt_start and a.date <= b.fecha
group by b.date

Но это не работает

Пример того, что я хочу, с 2-дневным скользящим окном:

Input
Day  Id
1    A
1    B
2    C
2    A
3    B
3    D
4    D

Result:
Day   Count(distinct Id)
1     2
2     3
3     4
4     2

Спасибо! :)

1 Ответ

0 голосов
/ 15 мая 2019

Рассмотрим коррелированный подзапрос:

select distinct t.date, 
       (select count(distinct sub.id)
        from mytable sub
        where sub.date >= date_sub(t.date, 27) 
          and sub.date <= t.date) as distinct_users_27_days
from mytable t

В качестве альтернативы, агрегация при самостоятельном объединении по периоду окна:

select t1.date, 
       count(distinct t2.id) as distinct_users_27_days
from mytable t1
cross join mytable t2 
where t2.date >= date_sub(t1.date, 27) 
  and t2.date <= t1.date
group by t1.date
...