簡體   English   中英

取消透視具有多列的 postgres 表

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

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