BigQuery で各レコードの行番号を取得する方法はありますか? (仕様では何も見ていません) NTH() 関数がありますが、これは繰り返しフィールドに適用されます。
BigQuery では、TOP() や LIMIT 関数の使用など、行番号が必要ないシナリオがいくつかあります。ただし、累積合計() などの一部の分析関数をシミュレートするには行番号が必要です。そのためには、各レコードを連番で識別する必要があります。これに対する回避策はありますか?
ご協力ありがとうございます!
レオ
ベストアンサー1
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)