Stored procedures 使用存储过程透视表

Stored procedures 使用存储过程透视表,stored-procedures,amazon-redshift,Stored Procedures,Amazon Redshift,所以我尝试使用红移中的存储过程来透视表。问题在于结果集是动态的。这意味着我们需要能够动态地透视下表。这正是我要尝试的重点: | object_uid | field | value | |------------|----------|----------| | post:1 | field_1_a| test | | post:2 | field_2_a| turtle | | post:2 | field_2_b| frog | | p

所以我尝试使用红移中的存储过程来透视表。问题在于结果集是动态的。这意味着我们需要能够动态地透视下表。这正是我要尝试的重点:

| 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 |
| .......    |  .....   | .......  | .......  | .......  |
|------------|----------|----------|----------|----------|
本质上,我试图通过子查询中的
selectlistag
语句构造一个列名称的链式字符串(字段*列),并尝试在
CREATE TABLE
sql语句中插入该语句的输出。然后,一旦构建了
createtable
sql语句,就可以通过
EXECUTE
命令执行sql语句

然而,这并不像预期的那样。我是一个相对较新的红移,所以我提前道歉,如果这是一个可怕的方式去旋转一张桌子从一个高的到一个宽的。这是我目前掌握的代码:

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”或其附近


有点被错误难住了。有人有任何线索/建议吗?

我在我们的GitHub repo“Amazon Redshift Utils”中添加了一个模拟PIVOT FOR语法的工作示例


我希望这对你有用。如果您有任何问题,请告诉我。

我在我们的GitHub repo“Amazon Redshift Utils”中添加了一个模拟PIVOT FOR语法的工作示例

我希望这对你有用。如果您有任何问题,请告诉我