2017-03-09 4 views
7

Ich weiß, dass diese Frage schon einmal gestellt wurde, aber keine der Antworten konnte mir helfen, meine gewünschten Anforderungen zu erfüllen. So stellt die Frage in neuem ThreadPivot für Rotverschiebung Datenbank

In Rotverschiebung wie schwenkt die Daten in eine Form einer Zeile pro jedes einzelnen Dimension-Set verwenden kann, zum Beispiel:

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

zu

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 

Die Kategorie oben aufgeführt wird sich ständig ändern. Redshift unterstützt den Pivot-Operator nicht und ein case Ausdruck wäre keine große Hilfe (wenn nicht, schlagen Sie bitte vor wie es geht)

Wie kann ich dieses Ergebnis in Rotverschiebung erreichen?

(Obige ist nur ein Beispiel, würden wir 1000+ Kategorien haben und diese Kategorien halten die auf die Veränderung)

+0

Überprüfen Sie diese Problemumgehung. Nicht ideal, erlaubt aber eine beliebige Anzahl von Kategorien. http: // Stapelüberlauf.com/questions/42684179/aws-redshift-pivot-table-all-dimensions/42687221 # 42687221 – systemjack

Antwort

2

Ich glaube nicht, gibt es eine einfache Möglichkeit, dass in Redshift,

auch zu tun ist, Sie sagen, Sie mehr als 1000 Kategorien haben und die Zahl wächst Sie in der Einnahme müssen Sie Limit von 1600 Spalten pro Tabelle berücksichtigen haben,

siehe beigefügten Link [http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_usage.html][1]

Sie können Fall verwenden, aber dann müssen Sie Fall für jede Kategorie

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 

andere Option ist zum Erstellen der Tabelle zum Beispiel R laden und dann können Sie CAST-Funktion zum Beispiel verwenden.

cast(data, name~ category) 

und dann die Daten laden zurück zu S3 oder Redshift

+0

Danke für die Antwort und informiert mich über Einschränkungen der Rotverschiebung – ankitkhanduri

0

Wenn Sie werden in der Regel spezifische Untergruppen der Kategorien aus der Pivot-Tabelle abfragen möchten, eine Abhilfe basiert auf dem Ansatz in den Kommentaren verknüpft funktionieren könnte .

Sie können wie Ihre "pivot_table" aus dem ursprünglichen bevölkern so:

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 
) 

nutzen und spezielle Kategorien auf diese Weise:

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 

Mit varchar(max) für die JSON Spaltentyp wird 65535 Bytes geben die sollte Platz für ein paar tausend Kategorien sein.

+0

Vielen Dank für die Hilfe Systemjack, aber ich denke, sogar ein JSON Extrahieren muss ich manuell schreiben tht Kategorie Name und dann tht, Da das Menü behalten und ändern und Kategorie sind verpflichtet, mit der Zeit zu ändern, so müssen die pivot_table Abfrage manuell zu extrahierten aktualisierten Kategorie und auch wenn weitere Restaurants die Zählung hinzugefügt werden von Spalten wuld erhöhen Abfrage muss für eine Änderung in der Kategorie – ankitkhanduri

+0

bearbeitet werden und auch wie in der obigen Antwort rotshift hingewiesen begrenzt eine Spalte auf 1600 für eine einzige Tabelle Also ich denke, was ich versuche, mit Redshift wu zu implementieren ld nicht machbar sein Wenn wrng plz vorschlagen, wie es sonst zu tun – ankitkhanduri

+0

Sie können 'Select *' mit diesem Ansatz nicht tun, so dass eine Einschränkung, die es für einige undurchführbar machen könnte. Sie müssen die Kategorien kennen und spezifizieren. Es hat nicht das 1600-Spalten-Problem, da es alles in nur 3 Spalten speichert. Die Kategoriedaten werden alle in eine einzige Zeichenfolge gepackt, die JSON-formatiert ist. – systemjack

Verwandte Themen