2017-03-09 162 views
7

我知道這個問題之前已經被問過了,但是任何答案都無法幫助我滿足我期望的要求。所以問這個問題在新線程紅移數據庫數據透視表

在紅移如何使用透視數據到每個每一個獨特的維度組一行的形式,例如:

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個類別和這些類別保持對不斷變化的)

+0

看看這個解決方法。不理想,但確實允許任意數量的類別。 HTTP://計算器。com/questions/42684179/aws-redshift-pivot-table-all-dimensions/42687221#42687221 – systemjack

回答

2

我不認爲這是一個簡單的方法來做到這一點的紅移,

也你說你有更多的則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功能,例如創建情況。

cast(data, name~ category) 

,然後將數據上傳回S3或紅移

+0

感謝您的回覆,並通知我有關redshift的侷限性 – ankitkhanduri

0

如果你通常會想查詢從數據透視表中類別的特定子集,基於評論鏈接的方法解決方法可能會奏效。

可以填充你的「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 

使用varchar(max)的JSON列類型將給65535個字節應該有幾千個類別的空間。

+0

感謝幫助systemjack, ,但我認爲即使提取一個json我需要手動寫入類別名稱,然後提取,因爲菜單保存和更改以及類別隨時間而變化,所以必須手動編輯pivot_table查詢以提取更新的類別 以及還有其他餐館正在添加時,count列wuld增加查詢必須被編輯爲 – ankitkhanduri

+0

類別的變化,也正如上面指出的答案紅移限制一列到1600單個表 因此,我想我正在嘗試使用紅移wu ld不可行 如果wrng plz建議如何去做 – ankitkhanduri

+0

你不能用這種方法做'select *',所以這是一個限制,可能會使其對某些人不可行。你必須知道並指定類別。它沒有1600列問題,因爲它只將所有內容存儲在3列中。類別數據全部被打包成一個恰好是JSON格式的單個字符串。 – systemjack