データ解析をする時に、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億行の連番が作れました。