Je sais que cette question a déjà été posée, mais aucune des réponses n'a pu m'aider à répondre à mes besoins. Donc, poser la question dans un nouveau fil
Dans redshift, comment utiliser les données sous forme de pivotement sous la forme d’une ligne pour chaque ensemble de dimensions unique, par exemple:
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
La catégorie listée ci-dessus continue à changer . Redshift ne supporte pas l'opérateur pivot et une expression case
ne serait pas d'une grande aide (si ce n'est pas le cas, suggérez comment le faire)
Comment puis-je obtenir ce résultat en redshift?
(Ce qui précède n'est qu'un exemple, nous aurions plus de 1000 catégories et ces catégories ne cessent de changer.)
Nous faisons beaucoup de pivot sur Ro - nous avons construit un outil basé sur python pour la génération automatique de requêtes pivot. Cet outil permet les mêmes options de base que ce que vous trouverez dans Excel, y compris la spécification de fonctions d'agrégation et la possibilité de choisir des agrégats globaux.
je ne pense pas qu'il y ait un moyen facile de le faire dans Redshift,
vous dites également que vous avez plus de 1000 catégories et que leur nombre augmente vous devez prendre en compte que vous avez une limite de 1600 colonnes par table,
voir le lien ci-joint [ http://docs.aws.Amazon.com/redshift/latest/dg/r_CREATE_TABLE_usage.html He's7]
vous pouvez utiliser le cas, mais alors vous devez créer un cas pour chaque catégorie
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
l’autre option consiste à télécharger le tableau, par exemple, sur R, puis à utiliser la fonction de conversion, par exemple.
cast(data, name~ category)
puis téléchargez les données sur S3 ou Redshift
Si vous souhaitez généralement interroger des sous-ensembles spécifiques de catégories à partir du tableau croisé dynamique, une solution de contournement basée sur l'approche liée dans les commentaires peut fonctionner.
Vous pouvez remplir votre "pivot_table" à partir de l'original de la manière suivante:
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
)
Et accédez aux catégories spécifiques de cette manière:
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
Utiliser varchar(max)
pour le type de colonne JSON donnera 65535 octets, ce qui devrait laisser la place à quelques milliers de catégories.