BigQuery の行番号は?質問する

BigQuery の行番号は?質問する

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)

おすすめ記事