collect_set () отдельные пользователи по дням за последние 90 дней, только если пользователь старше последних 90 дней - PullRequest
0 голосов
/ 09 мая 2020

на данный момент я смог collect_set() всех, кто активен, без проблем:

with aux as(
            select date
            ,collect_set(user_id) over(
                                    partition by feature
                                    order by cast(timestamp(date) as float)
                                    range between (-90*60*60*24) following  and 0 preceding
                                    ) as user_id
            ,feature
            --
            from (
                  select data
                  ,feature
                  ,collect_set(user_id)
                  --
                  from table
                  --
                  group by date, feature
                 )
           )
--
select date
,distinct_array(flatten(user_id))
,feature
--
from aux

Проблема в том, что теперь мне нужно сохранять только пользователей старше 90 дней, которые я пробовал и не сработало:

select date
,collect_set(case when user_created_at < date - interval 90 day
                  then user_id end) over(
                                      partition by feature
                                      order by cast(timestamp(date) as float)
                                      range between (-90*60*60*24) following  and 0 preceding
                                     ) as teste
,feature
from table

Причина, по которой это не сработало, заключается в том, что фильтр внутри collect_select() фильтрует только пользователей за один день, а не фильтрует всех пользователей за последние 90 дней, делая результат с большим количеством результатов, чем ожидалось.

Как я могу получить его правильно?

Для справки я использую этот запрос, чтобы проверить правильность:

select
count(distinct user_id) as total
,count(distinct case when user_created_at < date('2020-04-30') - interval 90 day then user_id end)
,count(distinct case when user_created_at >= date('2020-04-30') - interval 90 day then user_id end)
--
from table
--
where 1=1
and date >= date('2020-04-30') - interval 90 day
and date <= '2020-04-30'
and feature = 'a_feature'

1 Ответ

0 голосов
/ 11 мая 2020

довольно уродливый обходной путь, но:

select data
,feature
,collect_set(cus.client_id) as client
from (
      select data
      ,explode(array_distinct(flatten(client))) as client
      ,feature
      from( 
           select data
           ,collect_set(client_id) over(
                                        partition by feature
                                        order by cast(timestamp(data) as float)
                                        range between (-90*60*60*24) following  and 0 preceding
                                        ) as cliente
           ,feature
           from (
                 select data
                 ,feature
                 ,collect_set(client_id)             as cliente
                 from da_pandora.ds_transaction dtr
                 --
                 group by data, feature
                )
            )
      )as dtr
left join costumer as cus 
on cus.client_id = dtr.client and date(client_created_at) < data - interval 90 day
group by data, feature
...