2017-03-09 50 views
7

Wiem, że to pytanie zostało zadane wcześniej, ale żadna z odpowiedzi nie była w stanie mi pomóc spełnić moich żądanych wymagań. Więc zadać pytanie w nowym wątkuPivot dla bazy danych redshift

W redshifcie jak można wykorzystać dane przegubu w postaci jednego wiersza za każdego unikalnego zestawu wymiarów, np

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

do

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 

kategorii wymienione powyżej stale się zmieniają. Redshift nie obsługuje operatora przestawnego, a wyrażenie case nie byłoby zbyt pomocne (jeśli nie, proszę zasugerować, jak to zrobić)

Jak mogę osiągnąć ten wynik w przesunięciu ku czerwieni?

(Powyższe to tylko przykład, że mamy ponad 1000 kategorie i te kategorie zachować w sprawie zmianie)

+0

Sprawdź to obejście. Nie jest idealny, ale pozwala na dowolną liczbę kategorii. http: // stackoverflow.com/questions/42684179/aws-redshift-pivot-table-all-dimensions/42687221 # 42687221 – systemjack

Odpowiedz

2

nie sądzę, istnieje łatwy sposób to zrobić w przesunięciu ku czerwieni,

także mówisz, że mają więcej niż 1000 kategorie, a liczba ta rośnie trzeba, przy uwzględnieniu masz limit 1600 kolumn na stole,

patrz załączony odnośnik [http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_usage.html][1]

można użyć przypadek, ale wtedy trzeba utworzyć przypadek dla każdej kategorii

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 

inna opcja masz jest do przesłania tabeli dla przykładu do R, a następnie można użyć funkcji oddanych na przykład.

cast(data, name~ category) 

a następnie przesłać dane z powrotem do S3 lub redshifcie

+0

Dzięki za odpowiedź i poinformowanie mnie o ograniczeniach redshift – ankitkhanduri

0

Jeśli będzie zazwyczaj chcą kwerendy specyficzne podzbiory kategorii z tabeli przestawnej, obejście na podstawie podejścia związanego w komentarzach może działać .

można zapełnić „pivot_table” od oryginału tak:

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 
) 

i dostępu poszczególnych kategorii w ten sposób:

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 

Korzystanie varchar(max) dla typu kolumny JSON da 65535 bajty powinno być miejsce dla kilku tysięcy kategorii.

+0

Dzięki za pomoc systemjack, , ale myślę, że nawet wyciągając json muszę ręcznie wpisz nazwę kategorii tht, a następnie wyodrębnij tht, Ponieważ menu keep and changing i category mają się zmieniać wraz z upływem czasu, musisz ręcznie edytować zapytanie pivot_table do wyodrębnionej zaktualizowanej kategorii , a także, gdy dodawane są kolejne restauracje kolumn Wuld Zwiększenie zapytania musi być edytowane dla zmiany w kategorii – ankitkhanduri

+0

, a także jak zostało wskazane w powyższej odpowiedzi Redshift ogranicza kolumnę do 1600 dla pojedynczej tabeli Więc myślę, co próbuję wprowadzić za pomocą redshift wu Nie byłoby możliwe Jeśli wrng plz zasugeruje, jak to zrobić, – ankitkhanduri

+0

Nie można zrobić "wybierz *" z tym podejściem, więc jest to ograniczenie, które może uniemożliwić niektórym. Musisz znać i określić kategorie. Nie ma problemu z kolumną 1600, ponieważ przechowuje wszystko tylko w 3 kolumnach. Dane kategorii są pakowane w jeden ciąg, który ma format JSON. – systemjack