[英]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.