无法在Redshift上使用JOG与generate_series
问题描述:
Redshift上的generate_series函数在按照预期工作时用于简单的select语句。无法在Redshift上使用JOG与generate_series
WITH series AS (
SELECT n as id from generate_series (-10, 0, 1) n
) SELECT * FROM series;
-- Works fine
只要我添加JOIN条件,红移抛出
com.amazon.support.exceptions.ErrorException:功能 generate_series(整数,整数,整数) “不支持”
DROP TABLE testing;
CREATE TABLE testing (
id INT
);
WITH series AS (
SELECT n as id from generate_series (-10, 0, 1) n
) SELECT * FROM series S JOIN testing T ON S.id = T.id;
-- Function "generate_series(integer,integer,integer)" not supported.
红移版本
SELECT version();
-- PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.1485
有没有任何解决方法可以使这项工作?
答
你是对的,这在Redshift上不起作用。 请参阅here。
最简单的解决方法是事先用该表中的值“手动”创建一个永久表,例如,你可以使用该表为-1000行+1000,然后从该表中选择范围,
因此,对于你的榜样,你会碰到这样的
WITH series AS (
SELECT n as id from (select num as n from newtable where num between -10 and 0) n
) SELECT * FROM series S JOIN testing T ON S.id = T.id;
为你做这项工作?
或者,如果您不能创建表事先或不喜欢,你可以使用类似这样
with ten_numbers as (select 1 as num union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 0)
,generted_numbers AS
(
SELECT (1000*t1.num) + (100*t2.num) + (10*t3.num) + t4.num-5000 as gen_num
FROM ten_numbers AS t1
JOIN ten_numbers AS t2 ON 1 = 1
JOIN ten_numbers AS t3 ON 1 = 1
JOIN ten_numbers AS t4 ON 1 = 1
)
select gen_num from generted_numbers
where gen_num between -10 and 0
order by 1;
答
generate_series
不红移支持。它只能在领导者节点上独立工作。
一种解决方法是使用row_number
针对具有足够数量的行中的任何表:
with
series as (
select (row_number() over())-11 from some_table limit 10
) ...
也,这个问题被问多次已经