См. Инструкции в комментариях в коде.
Особенно важно: я просматриваю дни, а не месяцы для 1/30 отсканированных данных.
Обычно вы захотите чтобы сначала извлечь эти данные в новую таблицу, и тогда вам не нужно будет каждый раз сканировать столько ГБ, чтобы извлечь ежедневное количество звезд.
Решение:
WITH data AS (
SELECT ANY_VALUE(repo.name) name, repo.id
, MAX(CAST(JSON_EXTRACT_SCALAR(payload, '$.pull_request.base.repo.stargazers_count')AS INT64)) stars
, '20'||_table_suffix AS date
FROM `githubarchive.day.20*`
# day instead of month, 1/30th of data scanned
GROUP by repo.id, date
)
, stars_now AS (
SELECT ANY_VALUE(name) name, id, MAX(date) date, MAX(stars) stars
FROM data
WHERE date BETWEEN '20200526' AND '20200527'
# a couple days to capture projects without activity
GROUP BY id # names change, ids don't
ORDER BY stars DESC
LIMIT 100 # pick the top 100
)
, stars_before AS (
SELECT id, stars, date
FROM data
WHERE date BETWEEN '20190520' AND '20190527'
# a couple days to capture projects without activity
)
SELECT * # everything from stars_now
, (SELECT MAX(stars) FROM stars_before WHERE a.id=id) stars_before # an implicit JOIN
FROM stars_now a