[英]Unpivot postgres table having multiple columns
我想 pivot 一個表,其中包含如下所示的一些列。
ID | 第1周 | 第2周 | 第 3 周 | 第 4 周 | 第 5 周 | 第六周 | 第7周 |
---|---|---|---|---|---|---|---|
1 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
2 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
3 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
所需的 output 是 -
ID | 周數 | 周值 |
---|---|---|
1 | 1 | 8 |
1 | 2 | 9 |
1 | 3 | 10 |
1 | 4 | 11 |
1 | 5 | 12 |
1 | 6 | 13 |
1 | 7 | 14 |
2 | 1 | 15 |
2 | 2 | 16 |
2 | 3 | 17 |
2 | 4 | 18 |
2 | 5 | 19 |
2 | 6 | 20 |
2 | 7 | 21 |
3 | 1 | 22 |
3 | 2 | 23 |
3 | 3 | 24 |
3 | 4 | 25 |
3 | 5 | 26 |
3 | 6 | 27 |
3 | 7 | 28 |
我嘗試使用交叉表,但無法正常工作。 以下是我嘗試過的方法 -
select * from crosstab('select ID,week1, week2,week3,week4,week5,week6,week7 order by ID') as table_name(ID, week_number, week_value);
請有人幫忙,因為我在處理復雜的 sql 查詢方面沒有太多經驗。
這實際上與 pivot 相反,也稱為“unpivot”,可以使用橫向交叉連接來完成:
select t.id, x.*
from the_table t
cross join lateral (
values (1, week1), (2, week2), (3, week3),
(4, week4), (5, week5), (6, week6),
(7, week7)
) as x(week_number, week_value)
order by t.id, x.week_number
一種使用 JSONB 的快速替代方案,適用於任意數量的列,前提是其中一個列稱為id
。 無關,但結果看起來與臭名昭著的EAV 反模式驚人地相似。
with t as (select to_jsonb(t) j from the_table t)
select j ->> 'id' id,
(jsonb_each_text(j - 'id')).*
from t;
ID | 鑰匙 | 價值 |
---|---|---|
1 | 第1周 | 8 |
1 | 第2周 | 9 |
1 | 第 3 周 | 10 |
1 | 第 4 周 | 11 |
1 | 第 5 周 | 12 |
1 | 第六周 | 13 |
1 | 第7周 | 14 |
2 | 第1周 | 15 |
2 | 第2周 | 16 |
2 | 第 3 周 | 17 |
2 | 第 4 周 | 18 |
2 | 第 5 周 | 19 |
2 | 第六周 | 20 |
2 | 第7周 | 21 |
3 | 第1周 | 22 |
3 | 第2周 | 23 |
3 | 第 3 周 | 24 |
3 | 第 4 周 | 25 |
3 | 第 5 周 | 26 |
3 | 第六周 | 27 |
3 | 第7周 | 28 |
由於您使用 SparkSQL 標記了問題,因此這是使用stack
function 的解決方案:
SELECT ID,
stack(7, '1', week1, '2', week2, '3', week3, '4', week4, '5', week5, '6', week6, '7', week7) as (week_number, week_value)
FROM my_table
應用於您的示例:
df = spark.createDataFrame([
(1, 8, 9, 10, 11, 12, 13, 14),
(2, 15, 16, 17, 18, 19, 20, 21),
(3, 22, 23, 24, 25, 26, 27, 28)
], ["ID", "week1", "week2", "week3", "week4", "week5", "week6", "week7"])
df.createOrReplaceTempView("my_table")
spark.sql(above_query).show()
#+---+-----------+----------+
#| ID|week_number|week_value|
#+---+-----------+----------+
#| 1| 1| 8|
#| 1| 2| 9|
#| 1| 3| 10|
#| 1| 4| 11|
#| 1| 5| 12|
#| 1| 6| 13|
#| 1| 7| 14|
#| 2| 1| 15|
#| 2| 2| 16|
#| 2| 3| 17|
#| 2| 4| 18|
#| 2| 5| 19|
#| 2| 6| 20|
#| 2| 7| 21|
#| 3| 1| 22|
#| 3| 2| 23|
#| 3| 3| 24|
#| 3| 4| 25|
#| 3| 5| 26|
#| 3| 6| 27|
#| 3| 7| 28|
#+---+-----------+----------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.