BigQuery эквивалент SQL-запроса - PullRequest
0 голосов
/ 05 июня 2019

Я хотел бы выполнить следующий запрос в 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';

1 Ответ

0 голосов
/ 05 июня 2019

Просто используйте условное агрегирование и исправьте функции даты:

select user_id,
       avg(case when seqnum_asc <= 30 then score end) as first_n_avg,
       avg(case when seqnum_desc <= 30 then score end) 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) >= timestamp_add(min(created_at),  interval 1 year);

Функция в предложении having может быть timetamp_add(), datetime_add() или date_add(), в зависимости от типа created_at.

...