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语法的工作示例 我希望这对你有用。如果您有任何问题,请告诉我