web-dev-qa-db-fra.com

Pivot pour la base de données redshift

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.)

8
ankitkhanduri

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.

5
Sami Yabroudi

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

4
user3600910

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.

2
systemjack