BigQueryに2つの列を含むテーブルがあるとしましょう。最初の列は名前を表し、2番目の列は任意の長さの値の区切りリストです。例:
Name | Scores
-----+-------
Bob |10;20;20
Sue |14;12;19;90
Joe |30;15
次のように、最初が名前で、2番目が単一のスコア値である列に変換したいと思います。
Name,Score
Bob,10
Bob,20
Bob,20
Sue,14
Sue,12
Sue,19
Sue,90
Joe,30
Joe,15
これはBigQueryだけで実行できますか?
みなさん、朗報です! BigQueryがSPLIT()!できるようになりました
" データセットの複数の行に表示される2つのWordフレーズをすべて検索 "を見てください。
BigQueryで値をsplit()して文字列から複数の行を生成する現在の方法はありませんが、正規表現を使用してコンマを探し、最初の値を見つけることができます。次に、同様のクエリを実行して2番目の値を見つけます。上記の例で示したパターン(コンマによるUNION)を使用して、これらすべてを1つのクエリにマージできます。
誰かがまだ答えを探しているなら
select Name,split(Scores,';') as Score
from (
# replace the inner custome select with your source table
select *
from
(select 'Bob' as Name ,'10;20;20' as Scores),
(select 'Sue' as Name ,'14;12;19;90' as Scores),
(select 'Joe' as Name ,'30;15' as Scores)
);
書き直そうとすると Elad Ben Akouneの答え Standart SQLでは、クエリは次のようになります。
WITH name_score AS (
SELECT Name, split(Scores,';') AS Score
FROM (
(SELECT * FROM (SELECT 'Bob' AS Name ,'10;20;20' AS Scores))
UNION ALL
(SELECT * FROM (SELECT 'Sue' AS Name ,'14;12;19;90' AS Scores))
UNION ALL
(SELECT * FROM (SELECT 'Joe' AS Name ,'30;15' AS Scores))
))
SELECT name, score
FROM name_score
CROSS JOIN UNNEST(name_score.score) AS score;
そして、この出力。
+------+-------+
| name | score |
+------+-------+
| Bob | 10 |
| Bob | 20 |
| Bob | 20 |
| Sue | 14 |
| Sue | 12 |
| Sue | 19 |
| Sue | 90 |
| Joe | 30 |
| Joe | 15 |
+------+-------+