以前Prestoのクエリで縦横変換(pivot)を行う方法を初回しましたが、今回はその逆で横縦変換(unpivot)を紹介します。
参考記事と逆の変換やるわけですね。
そのため元のテーブルがこちら。
uid | c1 | c2 | c3 |
---|---|---|---|
101 | 11 | 12 | 13 |
102 | 21 | 22 | 23 |
結果として出力したいテーブルがこちらになります。
uid | key | value |
---|---|---|
101 | c1 | 11 |
101 | c2 | 12 |
101 | c3 | 13 |
102 | c1 | 21 |
102 | c2 | 22 |
102 | c3 | 23 |
一番シンプルな書き方は、UNIONを使う方法だと思います。
key の値ごとにvalue を抽出してそれぞの結果を縦に積み上げます。
SELECT
uid,
'c1' AS key,
c1 AS value
FROM
htable
UNION ALL SELECT
uid,
'c2' AS key,
c2 AS value
FROM
htable
UNION ALL SELECT
uid,
'c3' AS key,
c3 AS value
FROM
htable
ただ、この書き方には課題もあって、元の列数が多いとクエリが非常に冗長になります。
そこで、 UNNESTを使った方法を紹介しておきます。
ドキュメントは SELECT の説明のページの途中に UNNESTの章があります。
これを使うと次の様に書けます。
SELECT
uid,
t.key,
t.value
FROM
htable
CROSS JOIN UNNEST (
array['c1', 'c2', 'c3'],
array[c1, c2, c3]
) AS t (key, value)
とてもシンプルに書けました。