これは、必要な入力と必要な出力です。私はSQLまたはPrestoで使用される用語に精通しておらず、ドキュメントはmap_agg
の使用を示しているようですが、ここでの問題は動的に列を作成することだと思いますが、a, b, ...
列でこれが可能かどうか興味がありました既知で有限です。
SQLまたはPrestoでこれに適切な関数を知り、もちろんこれが可能かどうかを知っておくとよいでしょう。できれば、目的の行=>列ごとに手動で句を追加する必要のない方法で。これを自動的に行う方法、またはヘッダーに変換される行をフィルター処理する値のリストを提供する方法が必要です(以下の'a'
が列タイトルに移動する方法のように)
table_a
:
id | key | value
0 | 'a' | 1
1 | 'b' | 2
次に、desired
になります。
id | 'a' | 'b'
0 1 2
私が取得できる最も近い方法は、map_agg
を使用して、出力で一度に1つずつプルできるkey: values
のセットを取得することです。ただし、望ましい解決策は、最終的に出力したいすべてのkey
を明示的にリストする必要はなく、代わりにkvs
のすべてのキーを展開またはロールアウトすることです。
with subquery_A as (
select
id,
map_agg(A.key, A.value) as "kvs"
from A as a
group by 1
)
select
sub_a.id,
sub_a.kvs['a'],
sub_a.kvs['b']
from subquery_A as sub_a
ほとんどすべてのデータベースサーバーで、クエリは固定された列のセットを返します。 RDBMSは、クエリを適切に処理するために、出力する必要のある列を知る必要があります。
したがって、何らかの方法で、通常、出力列を明示的に定義する必要があります。
あなたのソリューションはPrestoDBでうまく機能しているようです。念のため、他のものと比較したい場合は、標準SQLの一般的なソリューションを次に示します。これは、条件付き集計を使用して、(固定された)列のセット上でデータをピボットします。 CTEを使用せず、ほとんどのRDBMSがこの構文をサポートしています。
SELECT
id,
MAX(CASE WHEN key = 'a' THEN value END) AS a
MAX(CASE WHEN key = 'b' THEN value END) AS b
FROM table_a
GROUP BY id
どうやらPIVOT関数はPrestodbに実装されていません。
あなたは以下のようにすることができます。それはあなたの解決策に似ていますが、多分少しきれいです:
SELECT
id,
key['a'] AS A,
key['b'] AS B
FROM (
SELECT id, map_agg(key, value) key
FROM table_a
GROUP BY id
) temp