30
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

BigQueryで無から連番のレコードを生成する方法

Last updated at Posted at 2016-11-01

データ解析をする時に、1から特定の番号までの連番が欲しくなることがたまにあります。
PostgreSQLならばGENERATE_SERIES関数を使うのですが、BigQueryではどのようにすればいいでしょうか?
いろいろと試してみて、それっぽい方法を見つけたので、書き残しておきます。

目的

無から以下のようなテーブルを生成する。

n
1
2
3
4
5
6
7
8
9
10

Legacy SQLを使う場合

SELECT
  n
FROM (
  SELECT
    m,
    ROW_NUMBER() OVER() AS n
  FROM
    FLATTEN((
      SELECT
        SPLIT(LPAD('', 10, '.'), '') AS m
      FROM (SELECT 0)), m))
ORDER BY n

LPADで長さ10の文字列を生成して、それをSPLITし、10行分のレコードを生成しています。
そして各行に対してROW_NUMBERで通し番号を振ることで、連番を生成しています。

下から二行目の10という数字を変えることで1〜10以外の連番を生成することもできます。

Standard SQLを使う場合

SELECT n FROM UNNEST(GENERATE_ARRAY(1, 10)) AS n ORDER BY n

GENERATE_ARRAY関数という、このために用意された関数があるので、こちらの方がシンプルです。

【番外編】GENERATE_ARRAYで100万個以上の連番を生成する方法

上で紹介した方法で、連番を作る場合、作れる連番の最大個数は1048576 (=2^20) に制限されてしまいます。
この制限を突破してみたいと思います。
「そんなにデカい連番なんていらないよ」という意見は無視します。

とりあえずは、1億行の連番を作ってみます。

WITH T AS (SELECT
  GENERATE_ARRAY(100 * l - 99, 100 * l) AS m
FROM
  UNNEST(GENERATE_ARRAY(1, 1000000)) AS l)

SELECT n FROM T, UNNEST(m) AS n

GENERATE_ARRAYが2重になりました。
内側のGENERATE_ARRAYで100万までの連番を作り、外側のGENERATE_ARRAYでそれを100倍にしています。

これで、100万行 * 100 = 1億行の連番が作れました。

30
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?