如何将数据集列表转换为redshift中的一组行

时间:2016-11-26 02:40:45

标签: amazon-redshift

我将数据集上传到Redshift数据库表中的两列:

{A, 1|2|3|4}

一旦加载到表中,我需要将其转换为一组行并将其插入另一个表中:

{A, 1},{A,2},{A,3},{A,4}

我想知道Redshift中是否存在我可以使用的特定功能,或者是否有任何人编写的特定SQL计划来执行此类转换。任何帮助表示赞赏。

注意: 第二列中的数据可以在1个数据点到1000个数据点的范围内变化。

2 个答案:

答案 0 :(得分:0)

EDIT2:Redshift不支持函数或触发器,因此以下仅在使用PostgreSQL数据库时有用

编辑:可以调用以下函数来执行插入操作,并且在将其调整到您的模式之后应该执行您需要的操作

CREATE OR REPLACE FUNCTION insert_function(title TEXT, data TEXT)
RETURNS BOOLEAN AS $$
  BEGIN
    INSERT INTO table_one(title, data) VALUES (title, data);
    INSERT INTO table_two(title, data) SELECT title, unnest(string_to_array(data, '|'));
    RETURN TRUE;
  END;
$$ LANGUAGE plpgsql

要进行插入,您需要执行以下操作:

SELECT insert_function('A', '1|2|3');

您需要调整以下函数和触发器以适合您的架构,但它应该按照您的要求执行:

CREATE OR REPLACE FUNCTION insert_function()
RETURNS trigger AS $$
  BEGIN
    INSERT INTO table_two(title, data) SELECT NEW.title, unnest(string_to_array(NEW.data, '|'));
    RETURN NEW;
  END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER insert_trigger AFTER INSERT ON table_one FOR EACH ROW EXECUTE PROCEDURE insert_function();

答案 1 :(得分:0)

借助@Charles Lee在sequence number generation function in AWS redshift上的一些代码:

首先,创建一个值为0到1000 的表。这是必需的,因为generate_series()函数无法在表级操作。

with seq_0_9 as (
select 0 as num
union all select 1 as num
union all select 2 as num
union all select 3 as num
union all select 4 as num
union all select 5 as num
union all select 6 as num
union all select 7 as num
union all select 8 as num
union all select 9 as num
)
select a.num + b.num * 10 + c.num * 100 as num
INTO numbers
from seq_0_9 a, seq_0_9 b, seq_0_9 c
order by num

让我们创建输入表格

CREATE TABLE one (a text, b text);
INSERT INTO one VALUES ('A', '1|2|3|4');

然后,提取第一列的每个组合和第二列中的拆分值:

CREATE TABLE two AS
SELECT
  a,
  split_part(b, '|', num) AS b
FROM one, numbers
WHERE
  num >0
  AND split_part(b, '|', num) != ''

表二中的结果是:

A 1
A 2
A 3
A 4