2017-10-16 38 views
4

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 

有沒有任何解決方法可以使這項工作?

回答

2

你是對的,這在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; 
1

generate_series不紅移支持。它只能在領導者節點上獨立工作。

一種解決方法是使用row_number針對具有足夠數量的行中的任何表:

with 
series as (
    select (row_number() over())-11 from some_table limit 10 
) ... 

也,這個問題被問多次已經