はい、各レコードのタイムスタンプ (場合によっては、特定のレコードの状態をキャプチャするフラグ) を追加するのが正しいアプローチです。BigQuery の「小さな結合」は、実際には少なくとも8 MB を返すことができます (この値は当社側で圧縮されているため、通常は 2 倍から 10 倍の大きさです)。そのため、「ルックアップ」テーブル タイプのサブクエリの場合、これは実際には多くの量を提供できます。レコードの。
あなたの場合、実行しようとしている正確なクエリが何であるかはわかりません..個々のアイテムごとに最新の販売時間を返そうとしているように見えます-そして、この情報を販売額の合計で結合します各アイテムの月あたり?クエリに関する詳細情報を提供できますか?
これをすべて 1 つのクエリで実行できる場合があります。たとえば、ウィキペディアのデータセットでは、例は次のようになります...
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;
...月ごとのユーザーごとのウィキペディアへの貢献を提供するため (アイテムごとの月ごとの売上など)。この結果は実際には非常に大きいため、日付範囲で制限する必要があります。
UPDATE(以下のコメントに基づく)特定の時間の後に貢献者による最新のウィキペディアのリビジョンの「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 を実行する必要がある場合)、別のオプションとして、このクエリを 2 つのクエリに分割することができます。最初のクエリは、月ごとの最大発効日とカウントを提供し、この結果を新しいテーブルとして保存できます。次に、結果のテーブルに対して合計クエリを実行できます。
また、毎月の売上レコードを別のテーブルに保存し、関心のある月の特定のテーブルのみをクエリして、毎月の売上概要を簡素化することもできます (これは、BigQuery をより経済的に使用することにもなります)。すべてのテーブルの集計を検索する必要がある場合は、FROM 句の後に複数のテーブルをリストしてクエリを実行できます。