BigQuery で各レコードの行番号を取得する方法はありますか? (仕様から、私はそれについて何も見ていません) NTH() 関数がありますが、それは繰り返しフィールドに適用されます。
TOP() や LIMIT 関数の使用など、BigQuery で行番号が必要ないシナリオがいくつかあります。ただし、累積合計 () などの分析関数をシミュレートするために必要です。そのためには、各レコードを連番で識別する必要があります。これに関する回避策はありますか?
よろしくお願いします。
レオ
BigQuery で各レコードの行番号を取得する方法はありますか? (仕様から、私はそれについて何も見ていません) NTH() 関数がありますが、それは繰り返しフィールドに適用されます。
TOP() や LIMIT 関数の使用など、BigQuery で行番号が必要ないシナリオがいくつかあります。ただし、累積合計 () などの分析関数をシミュレートするために必要です。そのためには、各レコードを連番で識別する必要があります。これに関する回避策はありますか?
よろしくお願いします。
レオ
2018 更新: 各行の一意の ID だけが必要な場合
#standardSQL
SELECT GENERATE_UUID() uuid
, *
FROM table
2018 #standardSQL ソリューション:
SELECT
ROW_NUMBER() OVER() row_number, contributor_username,
count
FROM (
SELECT contributor_username, COUNT(*) count
FROM `publicdata.samples.wikipedia`
GROUP BY contributor_username
ORDER BY COUNT DESC
LIMIT 5)
しかし、「クエリの実行中にリソースが超過しました。割り当てられたメモリでクエリを実行できませんでした。OVER() 演算子がメモリを使いすぎました..」
では、そのエラーを再現しましょう。
SELECT *, ROW_NUMBER() OVER()
FROM `publicdata.samples.natality`
はい - これは OVER() がすべてのデータを 1 つの VM に収める必要があるために発生します - これは PARTITION で解決できます:
SELECT *, ROW_NUMBER() OVER(PARTITION BY year, month) rn
FROM `publicdata.samples.natality`
「しかし、多くの行が同じ行番号を持ち、私が欲しかったのは行ごとに異なる ID だけでした」
はいはい。パーティションを使用して各行に行番号を付け、その行番号をパーティション フィールドと組み合わせて、行ごとに一意の ID を取得しましょう。
SELECT *
, FORMAT('%i-%i-%i', year, month, ROW_NUMBER() OVER(PARTITION BY year, month)) id
FROM `publicdata.samples.natality`
元の 2013 ソリューション:
朗報: BigQuery に row_number 関数が追加されました。
簡単な例:
SELECT [field], ROW_NUMBER() OVER()
FROM [table]
GROUP BY [field]
より複雑な実際の例:
SELECT
ROW_NUMBER() OVER() row_number,
contributor_username,
count,
FROM (
SELECT contributor_username, COUNT(*) count,
FROM [publicdata:samples.wikipedia]
GROUP BY contributor_username
ORDER BY COUNT DESC
LIMIT 5)
行識別子は公開していません。データをインポートするときに、データに1つ追加するだけで済みますか?
<= でテーブルをそれ自体に結合し、結果に対して count(*) を実行することで、ROW_NUMBER() 関数の欠如を回避できるのではないかと考えました (これは、MySQL で時々行う方法です)。結局のところ、BigQuery はまっすぐな「=」での結合のみをサポートしています。
再び失敗しました。これはBQでは不可能だと思います。