Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在AWS红移中旋转非数字表_Sql_Postgresql_Pivot_Crosstab - Fatal编程技术网

Sql 在AWS红移中旋转非数字表

Sql 在AWS红移中旋转非数字表,sql,postgresql,pivot,crosstab,Sql,Postgresql,Pivot,Crosstab,我在amazon redshift中有一个表,我想沿着一列旋转。例如 dim1 dim2 val x a 4s x b 5v y a 9l y b 3t 将变成: dim1 a b x 4s 5v y 9l 3t 请注意,AWS红移不支持pivot、crosstab、unnest或case扩展。此外,AWS在年提出的解决方案是不够的,因为它依赖于使用聚合函数,而且由于我的数据不是由数

我在amazon redshift中有一个表,我想沿着一列旋转。例如

dim1  dim2  val
x     a     4s
x     b     5v
y     a     9l
y     b     3t
将变成:

dim1   a    b  
x      4s   5v
y      9l   3t
请注意,AWS红移不支持pivot、crosstab、unnest或case扩展。此外,AWS在年提出的解决方案是不够的,因为它依赖于使用聚合函数,而且由于我的数据不是由数字组成的,这将无法可靠地工作(对吗?)

我能想到的最佳解决方案是自连接:

SELECT table.dim1, val as a, b
FROM table
WHERE dim2='a'
JOIN (
  SELECT dim1, val as b 
  FROM table
  WHERE dim2='b') AS t
ON t.dim1 = table.dim1
此解决方案的问题是,您必须对
dim2
的每个可能值进行一次自联接,这很快变得难以管理,因为(在我的现实世界中)我的表非常庞大,并且
dim2
中有20多个不同的值。对于
dim2
中的每个新值,我必须进行另一次自联接,以便:

SELECT table.dim1, val as a, b, c
FROM table
WHERE dim2='a'
JOIN (
  SELECT dim1, val as b 
  FROM table
  WHERE dim2='b') AS t
ON t.dim1 = table.dim1
JOIN (
  SELECT dim1, val as c 
  FROM table
  WHERE dim2='c') AS t2
ON t2.dim1 = table.dim1

我们可以看到这是如何迅速失控的。有更好的方法吗?

事实证明,AWS的答案已经足够了,您可以使用max()对字符串进行聚合:


但是在
dim2
中有任意多的值,这仍然很麻烦。我愿意接受更好的答案

事实证明AWS的答案已经足够了,您可以使用max()对字符串进行聚合:


但是在
dim2
中有任意多的值,这仍然很麻烦。我愿意接受更好的答案

如果不使用透视或交叉选项卡,这是我见过多次的解决方案如果您愿意,您可以删除
ELSE NULL
,这是默认选项。如果不使用透视或交叉选项卡,这是我见过多次的解决方案,如果您愿意,您可以删除
ELSE NULL
,这是默认选项。
SELECT dim1, MAX(a) AS a, MAX(b) AS b
FROM (
  SELECT dim1, 
    CASE dim2 WHEN 'a' THEN val ELSE NULL END as a,
    CASE dim2 WHEN 'b' THEN val ELSE NULL END as b
  FROM table
)
GROUP BY dim1;