因此,我尝试使用Redshift中的存储过程来透视表。问题在于结果集是动态的。这意味着我们需要能够动态地旋转下表。这就是我要努力解决的问题:
| object_uid | field | value |
|------------|----------|----------|
| post:1 | field_1_a| test |
| post:2 | field_2_a| turtle |
| post:2 | field_2_b| frog |
| post:3 | field_3_a| mountain |
| ...... | ..... | ...... |
|------------|----------|----------|
这将被归纳为以下内容:
| object_uid | field_1_a| field_2_a| field_2_b| field_3_a|
|------------|----------|----------|----------|----------|
| post:1 | test | | | |
| post:2 | | turtle | frog | |
| post:3 | | | | mountain |
| ....... | ..... | ....... | ....... | ....... |
|------------|----------|----------|----------|----------|
基本上,我试图通过子查询中的field_*
语句构造一个列名称(SELECT LISTAGG
列)的链接字符串,并尝试在CREATE TABLE
sql中插入该语句的输出声明。然后,一旦构造了CREATE TABLE
sql语句,就可以通过EXECUTE
命令执行sql语句。
但是,这并不符合预期。我是Redshift的新手,因此如果这是一种将桌子从高桌子旋转到宽桌子的可怕方法,我要提前道歉。这是我到目前为止的代码:
CREATE OR REPLACE PROCEDURE my_proc (
tmp_name INOUT varchar(256)
) AS $$
DECLARE
sql VARCHAR(MAX) := '';
BEGIN
WITH pivot_output AS (
SELECT LISTAGG(temp.output, ', ') WITHIN GROUP (ORDER BY temp.output) AS metadata FROM
(
SELECT DISTINCT
'MAX(IF(cm.metadata = ''' || metadata || ''',cm.field_value,NULL)) AS ' || QUOTE_LITERAL(metadata)
AS output
FROM "content_metadata" cm
WHERE cm."source_uid_type" = 'post'
) AS temp
);
sql = 'CREATE TABLE ' || tmp_name || ' AS SELECT cm.object_uid, ' || pivot_output.metadata || ' FROM content_metadata cm GROUP BY cm.object_uid';
EXECUTE sql;
END;
$$ LANGUAGE plpgsql;
CALL my_proc ('output_table');
尝试执行以上操作时出现以下错误:
数据库报告语法错误:Amazon无效操作:“ $ 1”或附近的语法错误;
该错误有点困扰。有人有任何线索/建议吗?
答案 0 :(得分:0)
我在我们的GitHub存储库“ Amazon Redshift Utils”中添加了一个模拟PIVOT FOR语法的工作示例。 https://github.com/awslabs/amazon-redshift-utils/blob/master/src/StoredProcedures/sp_pivot_for.sql
我希望这对您有用。让我知道您是否有任何问题。