是的,为每条记录添加时间戳(或者在某些情况下,添加捕获特定记录状态的标志)是正确的方法。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 子句后列出的多个表运行查询。