web-dev-qa-db-ja.com

Redshiftデータベースのピボット

この質問は以前に聞かれたことがあることは知っていますが、どのような答えも希望する要件を満たすのに役立ちませんでした。新しいスレッドで質問する

赤方偏移では、どのようにデータをピボットして、一意のディメンションセットごとに1行の形式にすることができますか。

id         Name               Category         count
8660     Iced Chocolate         Coffees         105
8660     Iced Chocolate         Milkshakes      10
8662     Old Monk               Beer            29
8663     Burger                 Snacks          18

id        Name              Cofees  Milkshakes  Beer  Snacks
8660    Iced Chocolate       105       10        0      0
8662    Old Monk             0         0        29      0
8663    Burger               0         0         0      18

上記のカテゴリは常に変化しています。 Redshiftはピボット演算子をサポートしておらず、case式はあまり役に立ちません(そうでない場合は、その方法を提案してください)

この結果を赤方偏移で達成するにはどうすればよいですか?

(上記は単なる例であり、1000以上のカテゴリがあり、これらのカテゴリは変化し続けます)

11
ankitkhanduri

Roで多くのピボットを行います- ピボットクエリを自動生成するためのpythonベースのツール を構築しました。このツールでは、集計関数の指定や全体的な集計が必要かどうかなど、Excelにあるものと同じ基本オプションを使用できます。

7
Sami Yabroudi

redshiftでそれを行う簡単な方法はないと思います。

また、1000を超えるカテゴリがあり、テーブルごとに1600列の制限があることを考慮するために取り入れる必要がある数が増えていると言います。

添付リンクを参照[ http://docs.aws.Amazon.com/redshift/latest/dg/r_CREATE_TABLE_usage.html] [1]

ケースを使用できますが、各カテゴリのケースを作成する必要があります

select id,
       name,
       sum(case when Category='Coffees' then count) as Cofees,       
       sum(case when Category='Milkshakes' then count) as Milkshakes,
       sum(case when Category='Beer' then count) as Beer,
       sum(case when Category='Snacks' then count) as Snacks
from my_table
group by 1,2

他のオプションとしては、たとえばテーブルをRにアップロードしてから、たとえばキャスト関数を使用できます。

cast(data, name~ category)

その後、データをS3またはRedshiftにアップロードして戻します

6
user3600910

通常、ピボットテーブルからカテゴリの特定のサブセットをクエリする場合は、コメントにリンクされているアプローチに基づく回避策が機能する可能性があります。

次のように、元の「pivot_table」にデータを入力できます。

_insert into pivot_table (id, Name, json_cats) (
    select id, Name,
        '{' || listagg(quote_ident(Category) || ':' || count, ',')
               within group (order by Category) || '}' as json_cats
    from to_pivot
    group by id, Name
)
_

この方法で特定のカテゴリにアクセスします。

_select id, Name,
    nvl(json_extract_path_text(json_cats, 'Snacks')::int, 0) Snacks,
    nvl(json_extract_path_text(json_cats, 'Beer')::int, 0) Beer
from pivot_table
_

JSON列タイプにvarchar(max)を使用すると、65535バイトが与えられます。

2
systemjack

@ user3600910はアプローチに適していますが、「END」が必要です。そうでない場合は「500310」の無効な操作が発生します。

select id,
       name,
       sum(case when Category='Coffees' then count END) as Cofees,       
       sum(case when Category='Milkshakes' then count END) as Milkshakes,
       sum(case when Category='Beer' then count END) as Beer,
       sum(case when Category='Snacks' then count END) as Snacks
from my_table
group by 1,2
0
Anshul Tak