на данный момент я смог 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'