0

由于 bigquery 是仅附加的,因此我正在考虑使用类似于 peoplesoft 的工作方式的“生效日期”标记我上传到它的每条记录,如果有人熟悉该模式的话。

然后,我可以发出选择语句并在最大生效日期加入

select UTC_USEC_TO_MONTH(timestamp) as month, sum(amt)/100 as sales
from foo.orders as all
join (select id, max(effdt) as max_effdt from foo.orders group by id) as latest
on all.effdt = latest.max_effdt and all.id = latest.id
group by month
order by month;

不幸的是,由于大查询“小连接”的限制,我相信这不会扩展,所以我想看看其他人是否考虑过这个用例。

4

1 回答 1

0

是的,为每条记录添加时间戳(或者在某些情况下,添加捕获特定记录状态的标志)是正确的方法。BigQuery“Small Join”的小边实际上可以返回至少8MB(这个值在我们端是压缩的,所以通常是2到10倍大),所以对于“lookup”表类型的子查询,这实际上可以提供很多的记录。

在您的情况下,我不清楚您要运行的确切查询是什么.. 看起来您正在尝试返回每个单独项目的最近销售时间 - 然后将此信息与销售量的总和一起加入每个项目每月?您能否提供有关查询的更多信息?

有可能在一个查询中完成所有这些操作。例如,在我们的维基百科数据集中,一个例子可能看起来像......

SELECT contributor_username,  UTC_USEC_TO_MONTH(timestamp * 1000000) as month, 
SUM(num_characters) as total_characters_used FROM 
[publicdata:samples.wikipedia] WHERE (contributor_username != '' or 
contributor_username IS NOT NULL) AND timestamp > 1133395200 
AND timestamp < 1157068800 GROUP BY contributor_username, month 
ORDER BY contributor_username DESC, month DESC;

...为每个用户每月提供维基百科贡献(如每个项目每月的销售额)。这个结果实际上非常大,因此您必须按日期范围进行限制。

更新(基于下面的评论)一个类似的查询,该查询为特定时间后贡献者的最新维基百科修订找到“num_characters”......

SELECT current.contributor_username, current.num_characters
FROM
(SELECT contributor_username, num_characters, timestamp as time FROM [publicdata:samples.wikipedia] WHERE contributor_username != '' AND contributor_username IS NOT NULL)
AS current
JOIN
(SELECT contributor_username, MAX(timestamp) as time FROM [publicdata:samples.wikipedia] WHERE contributor_username != '' AND contributor_username  IS NOT NULL AND timestamp > 1265073722 GROUP BY contributor_username) AS latest
ON 
current.contributor_username = latest.contributor_username
AND
current.time = latest.time;

如果您的查询要求您首先使用构建一个大型聚合(例如,您需要运行准确的 COUNT DISTINCT),另一种选择是将这个查询分成两个查询。第一个查询可以按月提供最大有效日期以及计数,并将此结果保存为新表。然后,可以对结果表运行求和查询。

您还可以将月度销售记录存储在单独的表中,并仅查询您感兴趣的月份的特定表,从而简化您的月度销售摘要(这也可能是 BigQuery 的一种更经济的使用方式)。当您需要在所有表中查找聚合时,您可以使用 FROM 子句后列出的多个表运行查询。

于 2012-05-29T04:07:36.030 回答