30

BigQuery で各レコードの行番号を取得する方法はありますか? (仕様から、私はそれについて何も見ていません) NTH() 関数がありますが、それは繰り返しフィールドに適用されます。

TOP() や LIMIT 関数の使用など、BigQuery で行番号が必要ないシナリオがいくつかあります。ただし、累積合計 () などの分析関数をシミュレートするために必要です。そのためには、各レコードを連番で識別する必要があります。これに関する回避策はありますか?

よろしくお願いします。

レオ

4

5 に答える 5

56

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)
于 2013-05-14T04:10:43.037 に答える
0

行識別子は公開していません。データをインポートするときに、データに1つ追加するだけで済みますか?

于 2012-06-15T20:59:36.613 に答える
0

<= でテーブルをそれ自体に結合し、結果に対して count(*) を実行することで、ROW_NUMBER() 関数の欠如を回避できるのではないかと考えました (これは、MySQL で時々行う方法です)。結局のところ、BigQuery はまっすぐな「=」での結合のみをサポートしています。

再び失敗しました。これはBQでは不可能だと思います。

于 2013-02-05T20:55:05.863 に答える