unpivot和PostgreSQL

PostgreSQL中是否有一个不相等的函数?

创build一个示例表:

CREATE TEMP TABLE foo (id int, a text, b text, c text); INSERT INTO foo VALUES (1, 'ant', 'cat', 'chimp'), (2, 'grape', 'mint', 'basil'); 

您可以使用UNION ALL'univot'或'uncrosstab':

 SELECT id, 'a' AS colname, a AS thing FROM foo UNION ALL SELECT id, 'b' AS colname, b AS thing FROM foo UNION ALL SELECT id, 'c' AS colname, c AS thing FROM foo ORDER BY id; 

这会在foo上运行3个不同的子查询,我们要为每个列都运行一个子查询,并在一个表中返回每个子查询中的每个logging。

但是,这将扫描表N次,其中N是您要unpivot列的数量。 这是效率低下的问题,例如,当您正在处理需要很长时间扫描的非常大的表时,这是一个很大的问题。

相反,使用:

 SELECT id, unnest(array['a', 'b', 'c']) AS colname, unnest(array[a, b, c]) AS thing FROM foo ORDER BY id; 

这更容易编写,它只会扫描一次表。

array[a, b, c]返回一个数组对象,其值为a,b和c作为元素。 unnest(array[a, b, c])将结果分解为每个数组元素的一行。

希望有所帮助!

FYI为我们这些寻找如何在RedShift不透明的。

由炖给出的长forms解决scheme似乎是实现这一目标的唯一方法。

https://forums.aws.amazon.com/thread.jspa?threadID=126369


对于那些不能看到它的人在这里粘贴下面的文字…

我们没有内置的function,将做透视或unpivot。 不过,你总是可以编写SQL来做到这一点。

 create table sales (regionid integer, q1 integer, q2 integer, q3 integer, q4 integer); insert into sales values (1,10,12,14,16), (2,20,22,24,26); select * from sales order by regionid; regionid | q1 | q2 | q3 | q4 ----------+----+----+----+---- 1 | 10 | 12 | 14 | 16 2 | 20 | 22 | 24 | 26 (2 rows) 

枢轴查询

 create table sales_pivoted (regionid, quarter, sales) as select regionid, 'Q1', q1 from sales UNION ALL select regionid, 'Q2', q2 from sales UNION ALL select regionid, 'Q3', q3 from sales UNION ALL select regionid, 'Q4', q4 from sales ; select * from sales_pivoted order by regionid, quarter; regionid | quarter | sales ----------+---------+------- 1 | Q1 | 10 1 | Q2 | 12 1 | Q3 | 14 1 | Q4 | 16 2 | Q1 | 20 2 | Q2 | 22 2 | Q3 | 24 2 | Q4 | 26 (8 rows) 

不透明查询

 select regionid, sum(Q1) as Q1, sum(Q2) as Q2, sum(Q3) as Q3, sum(Q4) as Q4 from (select regionid, case quarter when 'Q1' then sales else 0 end as Q1, case quarter when 'Q2' then sales else 0 end as Q2, case quarter when 'Q3' then sales else 0 end as Q3, case quarter when 'Q4' then sales else 0 end as Q4 from sales_pivoted) group by regionid order by regionid; regionid | q1 | q2 | q3 | q4 ----------+----+----+----+---- 1 | 10 | 12 | 14 | 16 2 | 20 | 22 | 24 | 26 (2 rows) 

希望这有助于尼尔

您可以使用PostgreSQL中的crosstab()函数来实现数据透视function。

请参阅http://www.postgresql.org/docs/current/static/tablefunc.html

这是一个关键的逆向操作。 我不确定用crosstab()实现unpivot是否简单,但也许这可以让你开始。

我为PostgreSQL写了一个可怕的unpivot函数。 这是相当缓慢,但它至less返回结果,如你所期望的unpivot操作。

https://cgsrv1.arrc.csiro.au/blog/2010/05/14/unpivotuncrosstab-in-postgresql/

希望你能find它有用的..