web-dev-qa-db-ja.com

回転によってPresto列を行に変換します

これは、必要な入力と必要な出力です。私は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
8
dalanmiller

ほとんどすべてのデータベースサーバーで、クエリは固定された列のセットを返します。 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
2
GMB

どうやら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
2
Pelin