使用存储过程来透视表

时间:2019-12-05 21:36:06

标签: stored-procedures amazon-redshift

因此,我尝试使用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”或附近的语法错误;

该错误有点困扰。有人有任何线索/建议吗?

1 个答案:

答案 0 :(得分:0)

我在我们的GitHub存储库“ Amazon Redshift Utils”中添加了一个模拟PIVOT FOR语法的工作示例。 https://github.com/awslabs/amazon-redshift-utils/blob/master/src/StoredProcedures/sp_pivot_for.sql

我希望这对您有用。让我知道您是否有任何问题。