合并为多行的日期为一行的行

时间:2020-02-26 21:24:57

标签: sql google-bigquery

我需要从Github中采样大量Java项目。我正在使用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   

我当前的查询:

*选择repo.name,从githubarchive.year.2018创建,类型为“ ReleaseEvent”,并且repo.name为IN(非常长的存储库列表)ORDER BY repo.name *;

我将添加一个JSON_EXTRACT来从有效负载中获取有效负载抓取URL

中选择repo.name,created_at,JSON_EXTRACT(payload,'$。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 个答案:

答案 0 :(得分:1)

我认为您只需要条件聚合:

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