web-dev-qa-db-ja.com

BigQueryの行番号?

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

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

よろしくお願いします!

レオ

12
Leo Stefa

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` 

enter image description here


元の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)
30
Felipe Hoffa

別の[〜#〜] hack [〜#〜]は次の行に沿って進むことになります:

_SELECT *
FROM UNNEST(ARRAY(
    SELECT myColumn FROM myTable
)) AS myValue WITH OFFSET off
_

これにより、myValueoffの2つの列を持つ結果セットが得られます。

これの利点は、off句でWHEREを使用して非決定論的なLIMITを作成することもできることです。 WHERE off < (SELECT SUM(amount) FROM mySecondTable)

これは、大量のデータの実行可能な代替手段とは考えていません。しかし、それはあなたのユースケースに合うかもしれません。

1
Melle

<=でテーブルをそれ自体に結合し、結果に対してcount(*)を実行することでROW_NUMBER()関数の欠如を回避できると思いました(これはMySQLで時々行う方法です)。結局のところ、BigQueryはストレートアップ "="での結合のみをサポートしています。

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

0
John

行識別子は公開しません。データをインポートするときに、データに単純に追加できますか?

0
Ryan Boyd