使用存储过程透视表
Posted
技术标签:
【中文标题】使用存储过程透视表【英文标题】:Pivot a table using a stored procedure 【发布时间】:2019-12-05 21:36:06 【问题描述】:所以我正在尝试使用 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 |
| ....... | ..... | ....... | ....... | ....... |
|------------|----------|----------|----------|----------|
本质上,我试图通过子查询中的SELECT LISTAGG
语句构造一个链接的列名字符串(field_*
列),并尝试在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 Invalid operation: syntax error at or near "$1";
有点被这个错误难住了。有没有人有任何线索/建议?
【问题讨论】:
【参考方案1】:我在我们的 GitHub 存储库“Amazon Redshift Utils”中添加了一个模拟 PIVOT FOR 语法的工作示例。 https://github.com/awslabs/amazon-redshift-utils/blob/master/src/StoredProcedures/sp_pivot_for.sql
我希望这对你有用。如果您有任何问题,请告诉我。
【讨论】:
以上是关于使用存储过程透视表的主要内容,如果未能解决你的问题,请参考以下文章