Объединить в одну строку с несколькими столбцами для дат - PullRequest
0 голосов
/ 27 февраля 2020

Мне нужно попробовать большое количество java проектов из Github. Я использую Google Big Query для запроса архива GitHub. В настоящее время я могу сделать длинный список, который содержит каждое событие релиза для лучших java репо.

Я хотел бы, однако, объединить результаты, когда результаты с соответствующим именем репо помещаются в одну строку, а затем создаются отдельные столбцы даты для каждого события, предпочтительно месяц за месяцем, со ссылкой на URL-адрес релиз, который я извлеку из полезной нагрузки JSON (может быть несколько событий релиза за один месяц). Я дал макет ниже

У меня мало опыта в SQL помимо базовых и я хотел бы знать, хочу ли я сделать это просто или сложно. Я могу сделать все это в java, но я надеюсь сэкономить время, используя SQL на этапе запроса.

ТЕКУЩИЙ ВЫХОД

repo.name        created at        link 

repoA   2018-12-06 02:04:27 UTC     url
repoA   2018-02-07 02:33:57 UTC     url
repoA   2018-02-18 00:55:15 UTC     url
repoB   2018-03-21 19:14:02 UTC     url
repoB   2018-04-11 02:07:04 UTC     url
repoC   2018-07-02 14:58:12 UTC     url

ЧТО ХОЧУ

        Jan     Feb     Mar     April   May
REPO A  URL     URL         
REPO B          URL     
REPO C          URL             URL , URL   

Мой текущий запрос:

* ВЫБЕРИТЕ имя-репозитория, созданного_от FROM githubarchive.year.2018 ГДЕ type = "ReleaseEvent" И имя-репозитория IN ( очень длинный список репозиториев ) ORDER BY repo.name *;

Я буду добавлять JSON_EXTRACT, чтобы получить полезную нагрузку, получить URL из полезной нагрузки

SELECT имя_ресурса, созданный_кат, JSON_EXTRACT (полезная нагрузка, '$. zipball_url') ОТ

СХЕМА:

type        STRING  NULLABLE    https://developer.github.com/v3/activity/events/types/
payload     STRING  NULLABLE    Event payload in JSON format
repo. name  STRING  NULLABLE    Repository name
created_at  TIMESTAMP   NULLABLE    Timestamp of associated event

1 Ответ

1 голос
/ 27 февраля 2020

Я думаю, вы просто хотите условную агрегацию:

SELECT repo.name, created_at,
       MAX(CASE WHEN EXTRACT(month FROM created_at) = 1 THEN link END) as jan,
       MAX(CASE WHEN EXTRACT(month FROM created_at) = 2 THEN link END) as feb,
       MAX(CASE WHEN EXTRACT(month FROM created_at) = 3 THEN link END) as mar
FROM githubarchive.year.2018
WHERE type = 'ReleaseEvent' AND
     repo.name IN ( very long list of repos ) 
GROUP BY BY repo.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...