BigQueryで横持ちを縦持ちに変換

こう言う横持ちになってるテーブルを

画像1


こう言う縦持ちのテーブルに変えたいと思ったら

スクリーンショット 2020-05-14 22.13.52


こんな記事を見つけたのでやってみた

実装してみた

上記に書いたようにフィールド名に「d_xx」のような規則性があれば
UDFのunpivotを呼び出して縦持ちに変換できた
`sample-project.sample.pivot`を自身のプロジェクトのテーブルに変えて
'd_'を自身の規則性に準じたものに変えれば動くはず

CREATE TEMP FUNCTION 
 unpivot(x ANY TYPE, col_regex STRING) AS (
 (
   SELECT
     ARRAY_AGG(
       STRUCT(
         REGEXP_EXTRACT(y, '[^"]*') AS key,
         REGEXP_EXTRACT(y, r':([^"]*)\"?[,}\]]') AS value 
       )
     )
   FROM
     UNNEST(
       (
         SELECT
           REGEXP_EXTRACT_ALL(json,col_regex||r'[^:]+:\"?[^"]+\"?') arr
         FROM (
           SELECT
             TO_JSON_STRING(x) json
         )
       )
     ) y 
 )
);
SELECT
 id,
 unpivotted
FROM
 `sample-project.sample.pivot` x,
 UNNEST(unpivot(x, 'd_')) unpivotted

各レコードをjson文字列に変換して
正規表現で「d_」を引っこ抜き、keyとvalueをそれぞれカラムに突っ込んでいく感じ

コピペしただけだけど
あとで思い出すようメモ

この記事が気に入ったらサポートをしてみませんか?