簡體   English   中英

AWS ATHENA 將列轉置為行

[英]AWS ATHENA Transpose Columns into Rows

我有一個 csv 文件上傳到一個 S3 存儲桶,我使用 AWS Glue 獲取該存儲桶,然后使用 Athena 進行查詢。 CSV 表格式如下:

物品 國家 類別 2017 2018 2019 2020
項目1 加州 網絡 128 129 130 129
項目2 加州 桌面 128 129 130 129
第 3 項 加州 應用 128 129 130 129

我想將該格式轉換為:

物品 國家 類別 價值
項目1 加州 網絡 2017 128
項目1 加州 網絡 2018 129
項目1 加州 網絡 2019 130
項目1 加州 網絡 2020 129
項目2 加州 桌面 2017 128
項目2 加州 桌面 2018 129
項目2 加州 桌面 2019 130
項目2 加州 桌面 2020 129
第 3 項 加州 應用 2017 128
第 3 項 加州 應用 2018 129
第 3 項 加州 應用 2019 130
第 3 項 加州 應用 2020 129

如何在 Athena 中使用 SQL 來實現這一點?

我試過了,但對我不起作用: Simple way to transpose columns and rows in SQL?

任何幫助表示贊賞。 謝謝!

Union all 在這里提供了一種選擇:

SELECT Item, Country, Category, 2017 AS Year, "2017" AS Value FROM yourTable
UNION ALL
SELECT Item, Country, Category, 2018, "2018" FROM yourTable
UNION ALL
SELECT Item, Country, Category, 2019, "2019" FROM yourTable
UNION ALL
SELECT Item, Country, Category, 2020, "2020" FROM yourTable
ORDER BY Item, Country, Category, Year, Value;

這種方法對於具有動態數量的年份列並不穩健。 但是話又說回來,無論如何你都不應該使用那個設計,因為它沒有標准化。 所以,希望你可以使用上面的查詢,或者它的一個小變種,讓你的數據標准化,因為它出現在預期的 output 中。

您可以通過創建一個數組然后取消嵌套數組來進行一次掃描:

select t.item, t.country, t.category, r.year, r.value
from t cross join
     unnest( array[ cast(row(2017, t."2017") as row(year int, value int)),
                    cast(row(2018, t."2018") as row(year int, value int)),
                    cast(row(2019, t."2019") as row(year int, value int)),
                    cast(row(2020, t."2020") as row(year int, value int))
                  ]
           ) u(r);

如果您的表確實是一個視圖或復雜查詢,則性能提升可能非常顯着。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM