この質問は以前に聞かれたことがあることは知っていますが、どのような答えも希望する要件を満たすのに役立ちませんでした。新しいスレッドで質問する
赤方偏移では、どのようにデータをピボットして、一意のディメンションセットごとに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以上のカテゴリがあり、これらのカテゴリは変化し続けます)
Roで多くのピボットを行います- ピボットクエリを自動生成するためのpythonベースのツール を構築しました。このツールでは、集計関数の指定や全体的な集計が必要かどうかなど、Excelにあるものと同じ基本オプションを使用できます。
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にアップロードして戻します
通常、ピボットテーブルからカテゴリの特定のサブセットをクエリする場合は、コメントにリンクされているアプローチに基づく回避策が機能する可能性があります。
次のように、元の「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バイトが与えられます。
@ 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