由于bigquery只是追加,我正在考虑使用类似于peoplesoft工作方式的“生效日期”标记我上传到它的每条记录,如果有人熟悉该模式的话。
然后,我可以发出一个select语句并加入最大生效日期
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;
不幸的是,我认为这不会扩展,因为大的查询'小连接'限制,所以我想看看是否有其他人想过这个用例。
答案 0 :(得分:0)
是的,为每条记录添加时间戳(或者在某些情况下,为捕获特定记录状态的标志)是正确的方法。 BigQuery“Small Join”的一小部分实际上可以返回至少 8MB(这个值在我们的末尾压缩,因此通常是2到10倍),因此对于“查找”表类型子查询,这实际上可以提供很多记录。
在您的情况下,我不清楚您尝试运行的确切查询是什么..看起来您正在尝试返回每个项目的最近销售时间 - 然后使用SUM加入此信息每个项目的销售额是每月?您能否提供有关查询的更多信息?
可以在一个查询中完成所有操作。例如,在我们的维基百科数据集中,示例可能类似于......
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子句后列出的多个表来运行查询。