Я хотел бы выполнить следующий запрос в BigQuery, в идеале, настолько эффективно, насколько это возможно.Идея состоит в том, что у меня есть все эти строки, соответствующие тестам (проводимым ежедневно) миллионами пользователей, и я хочу определить, насколько улучшился каждый пользователь.
«Улучшение» в этом случае - это среднее значение первого N, вычтенное из последнего N.
В этом примере N равно 30. (Я также добавил в части where cnt >= 100
, потому что я нене хочу учитывать пользователей, которые давно прошли тестирование и только что вернулись, чтобы попробовать еще раз.)
select user_id,
avg(score) filter (where seqnum_asc <= 30) as first_n_avg,
avg(score) filter (where seqnum_desc <= 30) as last_n_avg
from (select *,
row_number() over (partition by user_id order by created_at) as seqnum_asc,
row_number() over (partition by user_id order by created_at desc) as seqnum_desc,
count(*) over (partition by user_id) as cnt
from tests
) t
where cnt >= 100
group by user_id
having max(created_at) >= min(created_at) + interval '1 year';