BigQueryの各レコードの行番号を取得する方法はありますか? (仕様から、私はそれについて何も見ていません)NTH()関数がありますが、それは繰り返しフィールドに適用されます。
TOP()やLIMIT関数の使用など、BigQueryで行番号が不要なシナリオがいくつかあります。ただし、累積sum()などの分析関数をシミュレートするために必要です。そのためには、各レコードを連番で識別する必要があります。これの回避策はありますか?
よろしくお願いします!
レオ
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)
別の[〜#〜] hack [〜#〜]は次の行に沿って進むことになります:
_SELECT *
FROM UNNEST(ARRAY(
SELECT myColumn FROM myTable
)) AS myValue WITH OFFSET off
_
これにより、myValue
とoff
の2つの列を持つ結果セットが得られます。
これの利点は、off
句でWHERE
を使用して非決定論的なLIMIT
を作成することもできることです。 WHERE off < (SELECT SUM(amount) FROM mySecondTable)
これは、大量のデータの実行可能な代替手段とは考えていません。しかし、それはあなたのユースケースに合うかもしれません。
<=でテーブルをそれ自体に結合し、結果に対してcount(*)を実行することでROW_NUMBER()関数の欠如を回避できると思いました(これはMySQLで時々行う方法です)。結局のところ、BigQueryはストレートアップ "="での結合のみをサポートしています。
再び失敗した。これはBQでは不可能だと思います。
行識別子は公開しません。データをインポートするときに、データに単純に追加できますか?