中的数据[publicdata:samples.github_timeline]
看起来像是每个存储库在不同时间戳的快照。如果是这种情况,要计算每月每个 repo 的分叉数变化,我认为你不应该这样做SUM(repository_forks)
。相反,您希望获取每个月的第一个快照和最后一个快照,并进行minus
计算以获取delta
.
结果来自以下查询:
select repository_name, created_at, repository_forks
from [publicdata:samples.github_timeline]
where repository_name='Bukkit'
order by created_at;
但是,我不明白为什么在2012-03-11 08:30:21
,repository_forks 的数量Bukkit
为零。可能是数据错误?如果是数据错误,我会将它们视为异常值。对其设置一些阈值可能能够消除这些异常值。注意我设置的阈值:where repository_forks > 10
为了跳过坏数据。
SELECT top100.repository_name,
substr(created_at, 0, 7) month,
max(repository_forks)-min(repository_forks) monthly_increase,
min(repository_forks) monthly_begin_at,
max(repository_forks) monthly_end_with
FROM [githubarchive:github.timeline] timeline
JOIN
(SELECT repository_name , MAX(repository_forks) as forks
FROM [githubarchive:github.timeline]
WHERE (created_at CONTAINS "2012-04-01")
GROUP BY repository_name
ORDER BY forks DESC LIMIT 100) top100
on timeline.repository_name = top100.repository_name
where repository_forks > 10
GROUP BY top100.repository_name, month
ORDER BY top100.repository_name, month;
结果如下:
如果我错了并且 repository_forks 的数量已经发生了变化,那么您可以继续按照您所做的那样对 repository_forks 进行求和。然后它实际上更容易:
SELECT repository_name, substr(created_at,0,7) as month, SUM(repository_forks) as forks
FROM [publicdata:samples.github_timeline] timeline
JOIN
(SELECT repository_url , MAX(repository_forks) as forks
FROM [publicdata:samples.github_timeline]
WHERE (created_at CONTAINS "2012-04-01")
GROUP BY repository_url
ORDER BY forks DESC LIMIT 100) top100
on timeline.repository_url = top100.repository_url
GROUP BY repository_name, month
ORDER BY repository_name, month DESC;
更新:
是的。我将数据集更改为指向githubarchive:github.timeline
,然后我有数据,直到 2012 年 12 月。相应sql
和结果已更新。但是数据质量不好,还是看到很多outlier
数据点。